Come si ottiene il nome del repository Git in alcuni repository Git?


144

Quando lavori in una directory Git, come puoi ottenere il nome del repository Git in un repository Git? Ci sono dei comandi 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

Sembra che questo sia ciò che stai cercando. stackoverflow.com/questions/4076239/…
Max Sherman

No, probabilmente non è quello che vuole. Questo potrebbe essere, però: stackoverflow.com/questions/957928/...
Nevik Rehnel

se usi node.js potresti provare npmjs.com/package/git-repo-name
jonschlinkert

Risposte:


153

Bene, se per il nome del repository intendi il nome della directory radice Git (quello che contiene la directory .git) puoi eseguire questo:

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

La git rev-parse --show-toplevelparte fornisce il percorso per quella directory e basenamerimuove la prima parte del percorso.


9
Come dice @mvp di seguito, è possibile modificare il nome della directory contenente la .gitsottodirectory, quindi non è vero che "se, per il nome del repository si intende il nome della directory radice git".
sheac,

7
Questo comando ti dà esattamente questo: il nome della directory direttamente sopra la directory .git. Questa è un'interpretazione per "il nome del repository", e sembra che sia quello che l'OP stava cercando. Ovviamente ci sono altre interpretazioni valide, come il nome del repository di origine remoto. Non esiste una verità universale in questo caso e dipende davvero da ciò che vuoi.
Fuad Saud,

1
Non funziona in Windows 8.1 quando la mia directory sembra "Progetto 1.1". Fa solo eco a "Progetto". Inoltre il nome della cartella qui non è necessariamente correlato al mio nome repository, giusto?
Buttle Butkus,

Domanda aggiuntiva: come aggiungere questo come stringa nella catena come: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Come probabilmente vedrai questa riga non funzionerà a causa dell'uso di `` inside ''
fearis

1
Questo non è sicuro. Prova cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevele ti restituirà / var / www / html
sibaz

126

In generale, non puoi farlo. A Git non importa come viene chiamato il tuo repository git. Ad esempio, puoi rinominare la directory contenente il tuo repository (uno con una .gitsottodirectory) e git non lo noterà nemmeno, tutto continuerà a funzionare.

Tuttavia, se lo hai clonato, puoi usare il comando:

git remote show origin

per visualizzare molte informazioni sul telecomando originale da cui hai clonato il repository e conterrà l'URL del clone originale.

Se, tuttavia, hai rimosso il collegamento all'utilizzo remoto originale git remote rm origin, o se hai creato quel repository utilizzando git init, tali informazioni sono semplicemente impossibili da ottenere - non esistono da nessuna parte.


2
Puoi sempre ottenere il nome del ramo usando bene, git branch:) (il ramo attivo sarà contrassegnato da una stella *).
MVP

95

Non è necessario contattare il repository per ottenere il nome e il nome della cartella non rifletterà necessariamente il nome remoto.

Ho trovato che questo è il modo più accurato ed efficiente per ottenere l'attuale nome del repository:

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

Questo dovrebbe funzionare a partire da Git 1.8.1.5. Prima di questo, il git-repo-configcomando ora deprecato avrebbe funzionato (già Git 1.7.5).


4
D'accordo, questa è la risposta più chiara (in passato avevo $ {PWD ## * /} ma come dici tu, il nome della cartella corrente potrebbe essere diverso dall'origine)
Vincent De Smet

sì, stavo cercando questo, molto apprezzato.! il mio nome della cartella differiva;)
csomakk l'

Questo funziona anche: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

In git v2.7.0 + , è get-urlstato introdotto un sottocomando per il git-remotecomando.

Shell POSIX:

basename $(git remote get-url origin)

PowerShell:

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

Ricevo .gitla fine della mia stringa usando questo metodo, quindi ho aggiunto una divisione per toglierla:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Se ti capita di usare questo in Jenkins, ti consigliamo di eliminare la nuova riga finale con un trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

Altre risposte non funzioneranno ancora quando il nome della directory non corrisponde al nome del repository remoto (e potrebbe). Puoi ottenere il vero nome del repository con qualcosa del genere:

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

Fondamentalmente, chiami git remote show origin, prendi l'URL del repository dal campo "Recupera URL:" e regex per ottenere la porzione con nome: https://github.com/dragn/ neat-vimrc .git


1
Sì, va bene, ma questo richiederà il telecomando per un aggiornamento. È meglio usare git remote show origin -nper evitarlo.
Ryanmt,

1
Possiamo aggiornare il comando sed in modo che funzioni anche quando l'URL di origine non termina in .git? così 'foo.git' diventa 'foo', ma anche 'foo' è abbinato? Immagino che abbiamo bisogno di abbinamenti non golosi?
Arnout Engelen,

@ArnoutEngelen Penso che la cosa più semplice da fare è (facoltativamente) spogliarsi .gitcon un'altra chiamata a sed, ho aggiornato il codice nella risposta. In questo modo funzionerà quando l'URL non termina .git.
dragn il

Ha senso! Buona!
Arnout Engelen,

7
Questo più semplice ha sedfunzionato meglio sul mio Mac OSX:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

Se stai cercando di ottenere il nome utente o il nome dell'organizzazione E il nome del progetto o del repository su github, sono stato in grado di scrivere questo comando che funziona almeno per me localmente.

 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

Questo è il risultato desiderato così come Vydiail nome dell'organizzazione e gouramiil nome del pacchetto. Combinati possono aiutare a formare il User/Repopercorso completo


5

Penso che questo sia un modo migliore per identificare in modo inequivocabile un clone di un repository.

git config --get remote.origin.urle verificando che l'origine corrisponda ssh://your/repo.


1
In realtà una condizione più forte, richiede meno analisi. Potrebbe essere necessario specificare il nome dell'URL invece del nome del progetto, ma un piccolo prezzo da pagare. Il modo in cui lo fanno tutti gli altri si spezzerebbe se ".git" si fosse verificato nel nome del repository. Improbabile, ma possibile.
Shane J,

1
@ShaneJ hai ragione e mi hai spinto a scrivere la mia risposta che gestisce il ".git" nel nome del repository di origine remoto: stackoverflow.com/a/58843794/2696867
animatedgif

5

Un po 'in ritardo per questa domanda, ma se tu:

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

Vedrai l'URL del repository che includerà il nome utente:

[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

Se vuoi l'intero nome del repository GitHub ('nome completo') - utente / repository e vuoi farlo con Ruby ...

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

2

Repo nome completo:

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

Nella domanda, gipcompany menziona essere da qualche parte in fondo alla gerarchia di directory. Anche se non sono sicuro di ciò che vuole effettivamente (c'è un esempio - potrebbe essere " ottenere il nome del repository Git da qualsiasi parte del repository Git " (che è in contrasto con il modo in cui immagino i repository git)), non vedo alcuna indicazione che un / l'URL dovrebbe essere noto.
Greybeard,

1

Questo approccio ha git-remotefunzionato bene per i telecomandi HTTPS:

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

Esempio


1

Ecco una funzione bash che stamperà il nome del repository (se è stato impostato correttamente):

__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
}

Spiegazione:

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

Questo viene eseguito git rev-parse --git-dir, che stampa il percorso completo della .gitdirectory del repository corrente. Memorizza il percorso $gitdir.

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

Questo viene eseguito cat ${gitdir}/description, che stampa il contenuto del .git/descriptionrepository corrente. Se hai nominato correttamente il tuo repository, verrà stampato un nome. Altrimenti, stamperàUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Se il repository è stato nominato correttamente, quindi stampare il contenuto.

else

Altrimenti...

echo "Unnamed repository!"

Comunicare all'utente che il repository non era denominato.


Qualcosa di simile è implementato in questo script .


1

Sfortunatamente, sembra che Git non abbia tale comando incorporato. Ma puoi facilmente aggiungerlo tu stesso con alias Git e un po 'di magia della shell.

Come sottolineato da questa risposta , puoi usare git rev-parse --show-toplevelper mostrare la radice della tua cartella Git corrente.

Se vuoi usarlo regolarmente, probabilmente è più conveniente definirlo come alias. Per questo, usato git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Successivamente, è possibile utilizzare git rootper visualizzare la cartella principale del repository in cui ci si trova attualmente.

Se si desidera utilizzare un nome di sottocomando diverso da root, è sufficiente sostituire la seconda parte del alias.rootcomando sopra con quello che si desidera.

Per dettagli sugli alias in Git, vedere anche la git configpagina man .


2
git config --add alias.root 'rev-parse --show-toplevel'- non è necessario lanciare nella shell un alias a comando singolo.
kostix

0

Ecco il mio:

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

non migliore degli altri, ma l'ho reso una funzione bash in modo da poter inserire il nome remoto se non è origine.

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

Inoltre scopro solo che ci sono alcune informazioni sui repository all'interno della .gitdirectory. Quindi puoi semplicemente guardare il FETCH_HEADfile nel terminale per vedere il nome del repository:

Esempio:

cd your_project_folder/.git
more FETCH_HEAD

Produzione:

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

Ed https://bitbucket.org/somebituser/some_repo.gitè il nome del tuo repository


0

Questo funziona abbastanza bene con git-2.18.2 e può essere lanciato dal repository target git esterno:

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


-1

Puoi usare: git remote -v

Documentazione: https://git-scm.com/docs/git-remote

Gestisci il set di repository ("telecomandi") di cui segui i rami. -v --verbose Sii un po 'più prolisso e mostra l'URL remoto dopo il nome. NOTA: questo deve essere posizionato tra telecomando e sottocomando.


1
git remote -vsta solo restituendo uno o più URL. Come sta rispondendo alla domanda?
Peter Mortensen,

Come affermato in precedenza, questo restituisce solo URL ... e restituisce 2 URL separati da un'interruzione di riga, con caratteri non necessari prima dell'URL. Quindi crea un problema includendo informazioni non necessarie, quindi presenta due percorsi per la ricerca, quindi non ottiene ancora il nome del repository.
Andrew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.