Como você obtém o nome do repositório Git em algum repositório Git?


144

Quando você está trabalhando em algum diretório Git, como você pode obter o nome do repositório Git em algum repositório Git? Existem comandos Git?

# I did check out bar repository and working in somewhere 
# under bar directory at this moment such as below.

$ git clone git://github.com/foo/bar.git
$ cd bar/baz/qux/quux/corge/grault # and I am working in here!
$ git xxx # <- ???
bar

Parece que é isso que você procura. stackoverflow.com/questions/4076239/…
Max Sherman #

Não, provavelmente não é isso que ele quer. Porém, isso pode ser o seguinte: stackoverflow.com/questions/957928/…
Nevik Rehnel 30/03

se você usar o node.js, você pode tentar npmjs.com/package/git-repo-name
jonschlinkert

Respostas:


153

Bem, se, para o nome do repositório, você quer dizer o nome do diretório raiz do Git (aquele que contém o diretório .git), você pode executar isso:

basename `git rev-parse --show-toplevel`

A git rev-parse --show-toplevelparte fornece o caminho para esse diretório e basenameretira a primeira parte do caminho.


9
Como o @mvp diz abaixo, você pode alterar o nome do diretório que contém o .gitsubdiretório, portanto não é verdade que "se, para o nome do repositório, você quer dizer o nome do diretório raiz do git".
sheac 03/09/14

7
Este comando fornece exatamente isso: o nome do diretório diretamente acima do diretório .git. Essa é uma interpretação para "o nome do repositório" e parece que é o que o OP estava procurando. Obviamente, existem outras interpretações válidas, como o nome do repositório de origem remoto. Não há verdade universal neste caso e isso realmente depende do que você deseja.
Fuad Saud 24/10

1
Não funciona no Windows 8.1 quando meu diretório se parece com "Projeto 1.1". Apenas ecoa "Projeto". Além disso, o nome da pasta aqui não está necessariamente relacionado ao meu nome de repo, certo?
Buttle Butkus

Pergunta adicional: como adicionar isso a uma string na linha da cadeia, como: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Como você provavelmente vê que esta linha não funcionará, causa o uso de `` inside ''
fearis

1
Isso não é seguro. Tente cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevele ele vai lhe dar de volta / var / www / html
sibaz

126

Em geral, você não pode fazer isso. O Git não se importa com o nome do seu repositório git. Por exemplo, você pode renomear o diretório que contém seu repositório (um com .gitsubdiretório) e o git nem notará isso - tudo continuará funcionando.

No entanto, se você o clonou, pode usar o comando:

git remote show origin

para exibir muitas informações sobre o controle remoto original das quais você clonou seu repositório e ele conterá o URL do clone original.

Se, no entanto, você removeu o link para o uso remoto original git remote rm origin, ou se você criou esse repositório usando git init, é impossível obter essas informações - elas não existem em nenhum lugar.


2
Você sempre pode obter o nome do ramo usando well git branch:): (o ramo ativo será marcado com estrela *).
Mvp

95

Não é necessário entrar em contato com o repositório para obter o nome, e o nome da pasta não refletirá necessariamente o nome remoto.

Eu descobri que essa é a maneira mais precisa e eficiente de obter o nome do repositório atual:

basename -s .git `git config --get remote.origin.url`

Isso deve funcionar a partir do Git 1.8.1.5. Antes disso, o git-repo-configcomando agora descontinuado teria funcionado (já no Git 1.7.5).


4
Concordou, esta é a resposta mais limpo (eu costumava ter $ {PWD ## * /} mas como você diz, o nome da pasta atual pode ser diferente da origem)
Vincent De Smet

sim, eu estava procurando por isso, muito apreciado.! meu nome de pasta diferia;)
csomakk em 11/02

Este também funciona: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

No git v2.7.0 + , um subcomando get-urlfoi introduzido no git-remotecomando.

Shell POSIX:

basename $(git remote get-url origin)

PowerShell:

Split-Path -Leaf (git remote get-url origin)

Eu recebo o .gitfinal da minha string usando esse método, então adicionei uma divisão para removê-la:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Se você estiver usando isso em Jenkins, desista da nova linha à direita com trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

Outras respostas ainda não funcionarão quando o nome do seu diretório não corresponder ao nome do repositório remoto (e poderia). Você pode obter o nome real do repositório com algo assim:

git remote show origin -n | grep "Fetch URL:" | sed -E "s#^.*/(.*)$#\1#" | sed "s#.git$##"

Basicamente, você chama git remote show origin, pega o URL do repositório no campo "Buscar URL:" e regexa-o para obter a parte com o nome: https://github.com/dragn/ neat-vimrc .git


1
Sim, tudo bem, mas isso consultará o controle remoto para uma atualização. É melhor usar git remote show origin -npara evitar isso.
Ryanmt 14/05

1
Podemos atualizar o comando sed para também funcionar quando o URL de origem não terminar em .git? então 'foo.git' se torna 'foo', mas 'foo' também é correspondido? Acho que precisamos de correspondência não gananciosa?
Arnout Engelen

@ArnoutEngelen Acho que a coisa mais simples a fazer é (opcionalmente) retirar .gitoutra chamada sed, atualizei o código na resposta. Dessa forma, ele funcionará quando o URL não terminar com .git.
Dragn

Faz sentido! Um bom!
Arnout Engelen

7
Este mais simples sedfuncionou melhor no meu Mac OSX:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu 22/03

6

Se você está tentando obter o nome de usuário ou nome da organização E o projeto ou o nome do repositório no github, consegui escrever este comando que funciona para mim localmente, pelo menos.

 git config --get remote.origin.url
# => https://github.com/Vydia/gourami.git

 git config --get remote.origin.url | sed 's/.*\/\([^ ]*\/[^.]*\).*/\1/' # Capture last 2 path segments before the dot in .git
# => Vydia/gourami

Este é o resultado desejado, assim como Vydiao nome da organização e gouramio nome do pacote. Combinados, eles podem ajudar a formar o User/Repocaminho completo


5

Eu acho que essa é uma maneira melhor de identificar inequivocamente um clone de um repositório.

git config --get remote.origin.urle verificando se a origem corresponde ssh://your/repo.


1
Na verdade, uma condição mais forte, requer menos análise. Pode ser necessário especificar o nome do URL em vez do nome do projeto, mas um preço pequeno a pagar. A maneira como todo mundo está fazendo isso seria interrompida se ".git" ocorresse no nome do repositório. Improvável, mas possível.
Shane J

1
@ShaneJ você está certo e você me levou a escrever a minha própria resposta que lida com a ".git" no nome origem repo remoto: stackoverflow.com/a/58843794/2696867
AnimatedGif

5

Um pouco tarde para esta pergunta, mas se você:

cat /path/to/repo/.git/config

Você verá o URL do repositório, que incluirá o novo nome:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/your_git_user_name/your_git_repo_name.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

2

Nome completo do repositório:

git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"

Na pergunta, a gipcompany menciona estar em algum lugar no fundo da hierarquia de diretórios. Embora eu não tenha certeza do que ele realmente deseja (há um exemplo - pode ser " obter o nome do repositório Git de qualquer lugar nesse repositório Git " (que está em desacordo com a maneira como imagino os repositórios git)), não vejo indicação de que um / a URL deve ser conhecida.
18719 greybeard

1

Essa abordagem git-remotefuncionou bem para mim para controles remotos HTTPS:

$ git remote -v | grep "(fetch)" | sed 's/.*\/\([^ ]*\)\/.*/\1/'
                                                |  |        | |
                                                |  |        | +---------------+
                                                |  |        | Extract capture |
                                                |  +--------------------+-----+
                                                |Repository name capture|
                                                +-----------------------+

Exemplo


1

Aqui está uma função bash que imprimirá o nome do repositório (se tiver sido configurado corretamente):

__get_reponame ()
{
    local gitdir=$(git rev-parse --git-dir)

    if [ $(cat ${gitdir}/description) != "Unnamed repository; edit this file 'description' to name the repository." ]; then
        cat ${gitdir}/description
    else
        echo "Unnamed repository!"
    fi
}

Explicação:

local gitdir=$(git rev-parse --git-dir)

Isso é executado git rev-parse --git-dir, o que imprime o caminho completo para o .gitdiretório do repositório atual. Ele armazena o caminho $gitdir.

if [ $(cat ${gitdir}/description) != "..." ]; then

Isso é executado cat ${gitdir}/description, o que imprime o conteúdo .git/descriptiondo seu repositório atual. Se você nomeou seu repositório corretamente, ele imprimirá um nome. Caso contrário, ele imprimiráUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Se o repositório foi nomeado corretamente, imprima o conteúdo.

else

De outra forma...

echo "Unnamed repository!"

Informe ao usuário que o repositório não foi nomeado.


Algo semelhante é implementado neste script .


1

Infelizmente, parece que o Git não possui esse comando embutido. Mas você pode adicioná-lo facilmente com aliases do Git e alguma mágica de shell.

Conforme indicado nesta resposta , você pode usar git rev-parse --show-toplevelpara mostrar a raiz da sua pasta Git atual.

Se você deseja usar isso regularmente, provavelmente é mais conveniente defini-lo como um alias. Para isso, usado git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Depois disso, você pode usar git rootpara ver a pasta raiz do repositório em que está atualmente.

Se você quiser usar outro nome de subcomando root, substitua simplesmente a segunda parte do alias.rootcomando acima pelo que desejar.

Para detalhes sobre aliases no Git, consulte também a git configpágina de manual .


2
git config --add alias.root 'rev-parse --show-toplevel'- não há necessidade de jogar no shell para um alias de comando único.
kostix

1

Se você deseja o nome completo do repositório do GitHub ('nome completo') - usuário / repositório e deseja fazê-lo com Ruby ...

git remote show origin -n | ruby -ne 'puts /^\s*Fetch.*:(.*).git/.match($_)[1] rescue nil'

0

Aqui está o meu:

git remote --verbose | grep origin | grep fetch | cut -f2 | cut -d' ' -f1

não é melhor que os outros, mas eu fiz uma função bash para que eu possa inserir o nome remoto se não for de origem.

grurl () {
  xx_remote=$1
  [ -z "$xx_remote" ] && xx_remote=origin
  git remote --verbose | grep "$1" | grep fetch | cut -f2 | cut -d' ' -f1
  unset xx_remote
}

0

Também acho que existem algumas informações de repo dentro do .gitdiretório. Então você pode apenas assistirFETCH_HEAD arquivo no terminal para ver o nome do repositório:

Exemplo:

cd your_project_folder/.git
more FETCH_HEAD

Resultado:

672e38391557a192ab23a632d160ef37449c56ac        https://bitbucket.org/fonjeekay/some_repo

E https://bitbucket.org/somebituser/some_repo.gité o nome do seu repositório


0

Este funciona muito bem com o git-2.18.2 e pode ser iniciado a partir do repositório externo do git target:

basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)


-1

Você pode usar: git remote -v

Documentação: https://git-scm.com/docs/git-remote

Gerencie o conjunto de repositórios ("controles remotos") cujas ramificações você controla. -v --verbose Seja um pouco mais detalhado e mostre o URL remoto após o nome. NOTA: Isso deve ser colocado entre o controle remoto e o subcomando.


1
git remote -vestá apenas retornando um ou mais URLs. Como isso está respondendo à pergunta?
Peter Mortensen

Como afirmado anteriormente, isso retorna apenas URLs ... e retorna 2 URLs separados por uma quebra de linha, com caracteres desnecessários antes do URL. Portanto, cria um problema incluindo informações desnecessárias, apresenta dois caminhos para pesquisar e ainda não recebe o nome do repositório.
Andrew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.