Wie erhält man den Namen des Git-Repositorys in einem Git-Repository?

144

Wie können Sie den Git-Repository-Namen in einem Git-Repository abrufen, wenn Sie in einem Git-Verzeichnis arbeiten? Gibt es Git-Befehle?

# 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
gipcompany
quelle
Es sieht so aus, als ob Sie danach suchen. stackoverflow.com/questions/4076239/…
Max Sherman
Nein, das will er wahrscheinlich nicht. Dies könnte jedoch sein: stackoverflow.com/questions/957928/…
Nevik Rehnel
Wenn Sie node.js verwenden, können Sie npmjs.com/package/git-repo-name
jonschlinkert

Antworten:

153

Wenn Sie für den Repository-Namen den Git-Stammverzeichnisnamen (den Namen, der das .git-Verzeichnis enthält) meinen, können Sie Folgendes ausführen:

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

Der git rev-parse --show-toplevelTeil gibt Ihnen den Pfad zu diesem Verzeichnis und entfernt basenameden ersten Teil des Pfads.

Fuad Saud
quelle
9
Wie @mvp weiter unten sagt, können Sie den Namen des Verzeichnisses ändern, das das .gitUnterverzeichnis enthält. Es ist also nicht wahr, dass "wenn Sie für den Repository-Namen den Namen des Git-Stammverzeichnisses meinen".
Sheac
7
Dieser Befehl gibt Ihnen genau das: den Namen des Verzeichnisses direkt über dem .git-Verzeichnis. Das ist eine Interpretation für "den Namen des Repositorys", und es scheint, dass es die ist, nach der OP gesucht hat. Offensichtlich gibt es andere gültige Interpretationen, wie den Namen des Remote-Ursprungs-Repositorys. In diesem Fall gibt es keine universelle Wahrheit und es hängt wirklich davon ab, was Sie wollen.
Fuad Saud
1
Funktioniert nicht in Windows 8.1, wenn mein Verzeichnis wie "Projekt 1.1" aussieht. Es gibt nur "Projekt" wieder. Außerdem hängt der Ordnername hier nicht unbedingt mit meinem Reponamen zusammen, oder?
Buttle Butkus
Zusätzliche Frage: Wie füge ich dies hinzu, um eine Zeichenfolge in der Kettenlinie zu sein, wie: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Wie Sie wahrscheinlich sehen, wird diese Zeile nicht funktionieren, da "inside" verwendet wird
Fearis
1
Das ist nicht sicher. Versuchen Sie cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevelund es gibt Ihnen zurück / var / www / html
sibaz
126

Im Allgemeinen können Sie dies nicht tun. Git ist es egal, wie Ihr Git-Repository benannt ist. Sie können beispielsweise das Verzeichnis umbenennen, das Ihr Repository enthält (eines mit .gitUnterverzeichnis), und git wird es nicht einmal bemerken - alles wird weiterhin funktionieren.

Wenn Sie es jedoch geklont haben, können Sie den folgenden Befehl verwenden:

git remote show origin

um viele Informationen über die ursprüngliche Fernbedienung anzuzeigen, von der Sie Ihr Repository geklont haben, und die die ursprüngliche Klon-URL enthält.

Wenn Sie jedoch den Link zur ursprünglichen Remote-Verwendung entfernt git remote rm originhaben oder wenn Sie dieses Repository mit erstellt haben git init, ist es einfach unmöglich, solche Informationen abzurufen - sie sind nirgendwo vorhanden.

mvp
quelle
2
Sie können den Namen des Zweigs immer mit well erhalten git branch:) (aktiver Zweig wird mit einem Stern markiert *).
MVP
95

Sie müssen sich nicht an das Repository wenden, um den Namen zu erhalten, und der Ordnername spiegelt nicht unbedingt den Remote-Namen wider.

Ich habe festgestellt, dass dies der genaueste und effizienteste Weg ist, um den aktuellen Repository-Namen zu erhalten:

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

Dies sollte ab Git 1.8.1.5 funktionieren. Zuvor hätte der jetzt veraltete git-repo-configBefehl funktioniert (bereits in Git 1.7.5).

Leckeres Weizen
quelle
4
Einverstanden, dies ist die sauberste Antwort (ich hatte früher $ {PWD ## * /}, aber wie Sie sagen, der aktuelle Ordnername kann vom Ursprung abweichen)
Vincent De Smet
Ja, ich habe danach gesucht, sehr geschätzt.! mein
Ordnername war
Dieser funktioniert auch: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
Fjammes
28

In git v2.7.0 + wurde ein Unterbefehl get-urlzum git-remoteBefehl eingeführt.

POSIX-Shell:

basename $(git remote get-url origin)

Power Shell:

Split-Path -Leaf (git remote get-url origin)
vulkanischer Rabe
quelle
Ich erhalte das .gitam Ende meines Strings mit dieser Methode, also habe ich einen Split hinzugefügt, um es zu entfernen:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone
Wenn Sie dies zufällig in Jenkins verwenden, sollten Sie die nachfolgende Newline mit einem trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone
17

Andere Antworten funktionieren immer noch nicht, wenn der Name Ihres Verzeichnisses nicht dem Namen des Remote-Repositorys entspricht (und dies könnte sein). Sie können den richtigen Namen des Repositorys folgendermaßen ermitteln:

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

Grundsätzlich Sie rufen git remote show origin, nehmen Sie die Repository - URL von „URL - Abruf:“ Feld und regex es den Teil mit dem Namen zu erhalten: https://github.com/dragn/ ordentlich-vimrc .git

ziehen
quelle
1
Ja, das ist in Ordnung, aber dies fragt die Fernbedienung nach einem Update ab. Es ist besser, dies git remote show origin -nzu verhindern.
Ryanmt
1
Können wir den Befehl sed so aktualisieren, dass er auch funktioniert, wenn die Ursprungs-URL nicht mit .git endet? Also wird 'foo.git' zu 'foo', aber 'foo' stimmt auch überein? Ich denke, wir brauchen ein nicht gieriges Matching?
Arnout Engelen
@ArnoutEngelen Ich denke, dass es am einfachsten ist, sich (optional) .gitmit einem anderen Anruf zu entfernen. Ich sedhabe den Code in der Antwort aktualisiert. Auf diese Weise funktioniert es, wenn die URL nicht mit endet .git.
Dragn
Macht Sinn! Gut!
Arnout Engelen
7
Dies einfacher sedfunktionierte besser auf meinem Mac OSX:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu
6

Wenn Sie versuchen, den Benutzernamen oder den Organisationsnamen UND den Projekt- oder Reponamen auf github abzurufen, konnte ich diesen Befehl schreiben, der zumindest lokal für mich funktioniert.

 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

Dies ist das gewünschte Ergebnis, ebenso Vydiawie der Organisationsname und gouramider Paketname. Zusammen können sie helfen, den vollständigen User/RepoPfad zu bilden

Animiertes GIF
quelle
5

Ich denke, dies ist ein besserer Weg, um einen Klon eines Repositorys eindeutig zu identifizieren .

git config --get remote.origin.urlund überprüfen, ob der Ursprung übereinstimmt ssh://your/repo.

OLIVER.KOO
quelle
1
Eigentlich eine stärkere Bedingung, erfordert weniger Analyse. Möglicherweise muss der URL-Name anstelle des Projektnamens angegeben werden, es ist jedoch ein geringer Preis zu zahlen. Die Art und Weise, wie alle anderen es tun, würde brechen, wenn ".git" im Repo-Namen vorkommt. Unwahrscheinlich, aber möglich.
Shane J
1
@ ShaneJ Sie haben Recht und Sie haben mich aufgefordert, meine eigene Antwort zu schreiben, die das ".git" im Repo-Namen des Remote-Ursprungs behandelt: stackoverflow.com/a/58843794/2696867
animiertes
5

Ein bisschen spät für diese Frage, aber wenn Sie:

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

Sie sehen die URL des Repositorys, die den Reponamen enthält:

[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
jonnyjandles
quelle
2

Repo vollständiger Name:

git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"
Limonade
quelle
In der Frage erwähnt gipcompany, dass es sich irgendwo tief in der Verzeichnishierarchie befindet. Ich bin mir zwar nicht sicher, was er eigentlich will (es gibt ein Beispiel - könnte sein, dass " der Name des Git-Repositorys von irgendwo in diesem Git-Repository abgerufen wird " (was im Widerspruch zu meiner Vorstellung von Git-Repositorys steht)), aber ich sehe keinen Hinweis darauf, dass a / Die URL sollte bekannt sein.
Graubart
1

Dieser Ansatz git-remotehat bei HTTPS-Fernbedienungen gut funktioniert:

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

Beispiel

Wirbel
quelle
1

Hier ist eine Bash-Funktion, die den Repository-Namen druckt (wenn er ordnungsgemäß eingerichtet wurde):

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

Erläuterung:

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

Dies wird ausgeführt git rev-parse --git-dir, wodurch der vollständige Pfad zum .gitVerzeichnis des aktuellen Repositorys gedruckt wird. Es speichert den Pfad in $gitdir.

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

Dies wird ausgeführt cat ${gitdir}/description, wodurch der Inhalt des .git/descriptionaktuellen Repositorys gedruckt wird . Wenn Sie Ihr Repository ordnungsgemäß benannt haben, wird ein Name gedruckt. Andernfalls wird es gedrucktUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Wenn das Repo richtig benannt wurde, drucken Sie den Inhalt.

else

Andernfalls...

echo "Unnamed repository!"

Teilen Sie dem Benutzer mit, dass das Repo nicht benannt wurde.


Ähnliches ist in diesem Skript implementiert .

MD XF
quelle
1

Leider scheint Git keinen solchen Befehl eingebaut zu haben. Sie können ihn jedoch ganz einfach selbst mit Git-Aliasen und etwas Shell-Magie hinzufügen.

Wie in dieser Antwort hervorgehoben , können Sie git rev-parse --show-topleveldas Stammverzeichnis Ihres aktuellen Git-Ordners anzeigen.

Wenn Sie dies regelmäßig verwenden möchten, ist es wahrscheinlich bequemer, es als Alias ​​zu definieren. Dafür verwendet git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Danach können Sie git rootden Stammordner des Repositorys anzeigen, in dem Sie sich gerade befinden.

Wenn Sie einen anderen Unterbefehlsnamen als verwenden möchten root, ersetzen Sie einfach den zweiten Teil des alias.rootobigen Befehls durch den gewünschten.

Einzelheiten zu Aliasnamen in Git finden Sie auch in der git configManpage .

Nevik Rehnel
quelle
2
git config --add alias.root 'rev-parse --show-toplevel'- Es ist nicht erforderlich, die Shell für einen Alias ​​mit einem Befehl zu verwenden.
Kostix
1

Wenn Sie den gesamten GitHub-Repository-Namen ('vollständiger Name') - Benutzer / Repository - möchten und dies mit Ruby tun möchten ...

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

Hier ist meins:

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

nicht besser als die anderen, aber ich habe es zu einer Bash-Funktion gemacht, damit ich den Remote-Namen eingeben kann, wenn er nicht ursprünglich ist.

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
}
Tamouse
quelle
0

Außerdem finde ich nur, dass es einige Repo-Informationen im .gitVerzeichnis gibt. Sie können also einfach die FETCH_HEADDatei im Terminal ansehen , um den Namen des Repos zu sehen:

Beispiel:

cd your_project_folder/.git
more FETCH_HEAD

Ausgabe:

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

Und https://bitbucket.org/somebituser/some_repo.gitist der Name Ihres Repositorys

Yevhenii Shashkov
quelle
0

Dieser funktioniert ziemlich gut mit Git-2.18.2 und kann von außerhalb des Git-Ziel-Repositorys gestartet werden:

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

fjammes
quelle
-1

Sie können verwenden: git remote -v

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

Verwalten Sie die Repositorys ("Fernbedienungen"), deren Zweige Sie verfolgen. -v --verbose Sei etwas ausführlicher und zeige die entfernte URL nach dem Namen. HINWEIS: Dies muss zwischen Remote und Unterbefehl platziert werden.

David
quelle
1
git remote -vgibt nur eine oder mehrere URLs zurück. Wie beantwortet dies die Frage?
Peter Mortensen
Wie bereits erwähnt, werden nur URLs zurückgegeben ... und es werden 2 durch einen Zeilenumbruch getrennte URLs mit unnötigen Zeichen vor der URL zurückgegeben. SO entsteht ein Problem, indem nicht benötigte Informationen eingefügt werden. Anschließend werden zwei Suchpfade angezeigt. Anschließend wird der Name des Repos immer noch nicht angezeigt.
Andrew