Назад | Перейти на главную страницу

Извлечь имя репозитория из URL-адреса GitHub в bash

Учитывая ЛЮБУЮ строку URL-адреса репозитория GitHub, например:

git://github.com/some-user/my-repo.git

или

git@github.com:some-user/my-repo.git

или

https://github.com/some-user/my-repo.git

Как лучше всего в bash извлечь имя репозитория my-repo из любой из следующих строк? Решение ДОЛЖЕН работают для всех типов URL, указанных выше.

Спасибо.

$ url=git://github.com/some-user/my-repo.git
$ basename=$(basename $url)
$ echo $basename
my-repo.git
$ filename=${basename%.*}
$ echo $filename
my-repo
$ extension=${basename##*.}
$ echo $extension
git

Я бы пошел с basename $URL .git.

Старый пост, но недавно я столкнулся с той же проблемой.

Регулярное выражение ^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$ работает для трех типов URL.

#!/bin/bash

# url="git://github.com/some-user/my-repo.git"
# url="https://github.com/some-user/my-repo.git"
url="git@github.com:some-user/my-repo.git"

re="^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$"

if [[ $url =~ $re ]]; then    
    protocol=${BASH_REMATCH[1]}
    separator=${BASH_REMATCH[2]}
    hostname=${BASH_REMATCH[3]}
    user=${BASH_REMATCH[4]}
    repo=${BASH_REMATCH[5]}
fi

Объяснение (увидеть это в действии на regex101):

  • ^ соответствует началу строки
  • (https|git) соответствует и захватывает персонажей https или git
  • (:\/\/|@) соответствует и захватывает персонажей :// или @
  • ([^\/:]+) соответствует и захватывает один или несколько символов, которые не являются / ни :
  • [\/:] соответствует одному символу, который является / или :
  • ([^\/:]+) соответствует и захватывает один или несколько символов, которые не / ни :, опять же
  • [\/:] соответствует персонажу /
  • (.+) соответствует и захватывает один или несколько символов
  • .git Спички....git, буквально
  • $ соответствует концу строки

Это если далеко не идеально, как что-то вроде https@github.com:some-user/my-repo.git подойдет, но я думаю, что для извлечения достаточно.

Подводя итоги:

  • Получить URL без суффикса (необязательно):

    url_without_suffix="${url%.*}"
    
  • Получить имя репозитория:

    reponame="$(basename "${url_without_suffix}")"
    
  • Потом получить имя пользователя (хоста):

    hostname="$(basename "${url_without_suffix%/${reponame}}")"
    

использовать регулярное выражение: /([^/]+)\.git$/

basename $git_repo_url | tr -d ".git"

basename - мое любимое, но вы также можете использовать sed:

url=git://github.com/some-user/my-repo.git
reponame="$(echo $url | sed -r 's/.+\/([^.]+)(\.git)?/\1/')"
# reponame = "my-repo"

"sed" удалит весь текст до последнего / + .git расширение (если существует), и сохранит совпадение группы \1 это все, кроме точки ([^.]+)