Extrai o nome do repositório da URL do GitHub no bash

6

Dada QUALQUER string de url do repositório GitHub como:

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

ou

[email protected]:some-user/my-repo.git

ou

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

Qual é a melhor maneira de bash extrair o nome do repositório my-repo de qualquer uma das seguintes sequências? A solução DEVE funcionar para todos os tipos de URLs especificados acima.

Obrigado.

    
por Justin 14.08.2012 / 05:54

6 respostas

11
$ 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
    
por 14.08.2012 / 06:12
6

Eu iria com basename $URL .git .

    
por 14.08.2012 / 05:58
4

Resumindo:

  • Obter url sem sufixo (opcional):

    url_without_suffix="${url%.*}"
    
  • Obter nome do repositório:

    reponame="$(basename "${url_without_suffix}")"
    
  • Obtenha o nome do usuário (host) depois:

    hostname="$(basename "${url_without_suffix%/${reponame}}")"
    
por 13.04.2016 / 17:36
3

Post antigo, mas enfrentei o mesmo problema recentemente.

O regex ^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$ funciona para os três tipos de URL.

#!/bin/bash

# url="git://github.com/some-user/my-repo.git"
# url="https://github.com/some-user/my-repo.git"
url="[email protected]: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

Explaination ( veja em ação no regex101 ):

  • ^ corresponde ao início de uma string
  • (https|git) corresponde e captura os caracteres https ou git
  • (:\/\/|@) corresponde e captura os caracteres :// ou @
  • ([^\/:]+) corresponde e captura um caractere ou mais que não é / nem :
  • [\/:] corresponde a um caractere que é / ou :
  • ([^\/:]+) corresponde e captura um caractere ou mais que não é / nem : , mais uma vez
  • [\/:] corresponde ao caractere /
  • (.+) corresponde e captura um caractere ou mais
  • .git corresponde a .git , literalmente
  • $ corresponde ao final de uma string

Isso está longe de ser perfeito, já que algo como [email protected]:some-user/my-repo.git seria compatível, mas acho que é bom o suficiente para extração.

    
por 19.06.2018 / 11:58
0

usa expressões regulares: /([^/]+)\.git$/

    
por 22.02.2016 / 14:41
0
basename $git_repo_url | tr -d ".git"
    
por 09.11.2018 / 19:28