Mercurial bietet eine Möglichkeit, das Stammverzeichnis (das .hg enthält) über zu drucken
hg root
Gibt es in git etwas Äquivalentes, um das Verzeichnis abzurufen, das das .git-Verzeichnis enthält?
git
version-control
wojo
quelle
quelle
bzr root
wurde viel in Bazaargit rev-parse --git-dir
, wie in diesem Kommentar erklärtAntworten:
Ja:
Wenn Sie den Git-Befehl direkter replizieren möchten, können Sie einen Alias erstellen :
und jetzt
git root
wird genauso funktionieren wiehg root
.Hinweis : In einem Submodul wird das Stammverzeichnis des Submoduls und nicht das übergeordnete Repository angezeigt . Wenn Sie Git> = 2.13 oder höher verwenden, können Submodule das Stammverzeichnis des Superprojekts auf eine Weise anzeigen. Wenn dein Git älter ist, siehe diese andere Antwort.
quelle
git config --global alias.exec '!exec '
damit ich Dinge wie tun kanngit exec make
. Dies funktioniert, weil Shell-Aliase immer im Verzeichnis der obersten Ebene ausgeführt werden.hg root
macht es. Es druckt das Verzeichnis der obersten Ebene Ihres ausgecheckten Repositorys aus. Es schaltet Sie nicht darauf um (und es konnte dies auch nicht tun, da das gesamte Konzept des aktuellen Verzeichnisses und Ihrer Shell zusammenwirkt).~/my.proj/foo/bar
und mit diesem verbunden~/my.proj
sind, werden Sie mit~/src/my.proj
dem obigen Befehl zu weitergeleitet~/src/my.proj
. Könnte ein Problem sein, wenn alles, was Sie danach tun möchten, nicht baumunabhängig ist..git
.Die
man
Seite fürgit-config
(unter Alias ) sagt:Unter UNIX können Sie also Folgendes tun:
quelle
.zshrc
einfüge und `alias cg =" cd $ (git root) "definiere, wird der $ () - Teil zur Quellzeit ausgewertet und zeigt immer auf ~ / dotfiles, da sich dort mein zshrc befindet .Wurde
--show-toplevel
erst kürzlich hinzugefügtgit rev-parse
oder warum erwähnt es niemand?Von der
git rev-parse
Manpage:quelle
git-rev-parse
da der Name darauf hindeutet, dass es um die Verarbeitung von Revisionsspezifikationen geht. Übrigens würde ich mich über einegit --work-tree
ähnliche Arbeit freuengit --exec-path[=<path>]
: "Wenn kein Pfad angegeben wird, druckt git die aktuelle Einstellung"; Zumindest, IMO, wäre es ein logischer Ort, nach einer solchen Funktion zu suchen.root = rev-parse --show-toplevel
in Ihrer gitconfig einen Alias erstellen.git config --global alias.root "rev-parse --show-toplevel"
und werden danngit root
in der Lage sein, die Arbeit zu erledigengit rev-parse --show-toplevel
funktioniert, als ich es in einem Submodul ausprobiert habe. Es gibt das Root-Verzeichnis des Git-Submoduls aus. Was druckt es für Sie?--show-cdup
bis--show-top-level
im Februar 2011 bearbeitet wurde (nachdem diese Antwort eingereicht wurde).Wie wäre es mit "
git rev-parse --git-dir
"?Die
--git-dir
Option scheint zu funktionieren.Von der git rev-parse-Handbuchseite :
Sie können es in diesem
git setup-sh
Skript in Aktion sehen .Wenn Sie sich in einem Submodul-Ordner mit Git> = 2.13 befinden , verwenden Sie :
Wenn Sie verwenden
git rev-parse --show-toplevel
, stellen Sie sicher, dass es mit Git 2.25+ (Q1 2020) ist .quelle
.git
wenn Sie sich bereits im Stammverzeichnis befinden. (Zumindest auf msysgit.)Um hier eine einfache Antwort zu schreiben, damit wir sie verwenden können
Um den Job zu erledigen, konfigurieren Sie einfach Ihr Git mit
und dann möchten Sie vielleicht Folgendes zu Ihrem hinzufügen
~/.bashrc
:so dass Sie einfach verwenden können
cdroot
, um an die Spitze Ihres Repos zu gelangen.quelle
Wenn Sie sich bereits in der obersten Ebene befinden oder nicht in einem Git-Repository,
cd $(git rev-parse --show-cdup)
werden Sie nach Hause gebracht (nur CD).cd ./$(git rev-parse --show-cdup)
ist eine Möglichkeit, dies zu beheben.quelle
cd "$(git rev-parse --show-cdup)"
. Dies funktioniert, weilcd ""
Sie nirgendwohin und nicht zurück gelangen$HOME
. Und es wird empfohlen, trotzdem $ () -Aufrufe in Anführungszeichen zu setzen, falls sie etwas mit Leerzeichen ausgeben (in diesem Fall jedoch nicht, dass dieser Befehl dies tut).$PWD
. In diesem Beispiel wird die Wurzel von git relativ zu$PWD
statt aufgelöstrealpath $PWD
.Verwenden Sie diese Kombination aus readlink und git rev-parse, um den absoluten Pfad des aktuellen Git-Stammverzeichnisses zu berechnen, beispielsweise zur Verwendung in einem Shell-Skript:
git-rev-parse --show-cdup
gibt Ihnen die richtige Anzahl von "..", um von Ihrem cwd zur Wurzel zu gelangen, oder die leere Zeichenfolge, wenn Sie sich an der Wurzel befinden. Stellen Sie dann "./" voran, um den leeren Zeichenfolgenfall zu behandeln, und verwenden Sie ihnreadlink -f
, um in einen vollständigen Pfad zu übersetzen.Sie können auch eine erstellen
git-root
in Ihrem PATH Befehl als Shell-Skript , um diese Technik anzuwenden:(Das Obige kann in ein Terminal eingefügt werden, um Git-Root zu erstellen und Ausführungsbits zu setzen. Das eigentliche Skript befindet sich in den Zeilen 2, 3 und 4.)
Und dann könnten Sie rennen
git root
, um die Wurzel Ihres aktuellen Baums zu erhalten. Beachten Sie, dass Sie im Shell-Skript "-e" verwenden, um das Beenden der Shell zu veranlassen, wenn die Rev-Analyse fehlschlägt, damit Sie den Exit-Status und die Fehlermeldung ordnungsgemäß abrufen können, wenn Sie sich nicht in einem Git-Verzeichnis befinden.quelle
"$(git rev-parse ...)"
anstelle von Hacks wie./$(git rev-parse ...)
.readlink -f
funktioniert bei BSD nicht gleich. In diesem SO finden Sie Problemumgehungen. Die Python-Antwort wird wahrscheinlich funktionieren, ohne etwas zu installieren :python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)"
.Wie andere angemerkt haben, ist der Kern der Lösung die Verwendung
git rev-parse --show-cdup
. Es gibt jedoch einige Randfälle, die behandelt werden müssen:Wenn das cwd bereits die Wurzel des Arbeitsbaums ist, gibt der Befehl eine leere Zeichenfolge aus.
Tatsächlich wird eine leere Zeile erzeugt, aber die Befehlsersetzung entfernt den Zeilenumbruch. Das Endergebnis ist eine leere Zeichenfolge.
In den meisten Antworten wird empfohlen, der Ausgabe
./
ein Präfix voranzustellen, damit eine leere Ausgabe entsteht,"./"
bevor sie eingespeist wirdcd
.Wenn GIT_WORK_TREE auf einen Speicherort festgelegt ist, der nicht das übergeordnete Element des CWD ist, kann die Ausgabe ein absoluter Pfadname sein.
Das Voranstellen
./
ist in dieser Situation falsch. Wenn a./
einem absoluten Pfad vorangestellt wird, wird es zu einem relativen Pfad (und sie beziehen sich nur auf denselben Speicherort, wenn cwd das Stammverzeichnis des Systems ist).Die Ausgabe kann Leerzeichen enthalten.
Dies gilt wirklich nur im zweiten Fall, hat aber eine einfache Lösung: Verwenden Sie doppelte Anführungszeichen um die Befehlssubstitution (und alle nachfolgenden Verwendungen des Werts).
Wie andere Antworten angemerkt haben, können wir dies tun
cd "./$(git rev-parse --show-cdup)"
, aber dies bricht im Fall der zweiten Kante (und im Fall der dritten Kante, wenn wir die doppelten Anführungszeichen weglassen).Viele Shells werden
cd ""
als No-Op behandelt, sodass wir dies für diese Shells tun könnencd "$(git rev-parse --show-cdup)"
(die doppelten Anführungszeichen schützen die leere Zeichenfolge als Argument im Fall der ersten Kante und bewahren Leerzeichen im Fall der dritten Kante). Laut POSIX ist das Ergebnis voncd ""
nicht spezifiziert, daher ist es möglicherweise am besten, diese Annahme zu vermeiden.Eine Lösung, die in allen oben genannten Fällen funktioniert, erfordert einen Test. Explizit gemacht, könnte es so aussehen:
cd
Für den Fall der ersten Kante wird Nein ausgeführt .Wenn es akzeptabel ist,
cd .
für den ersten Kantenfall zu laufen , kann die Bedingung in der Erweiterung des Parameters erfolgen:quelle
git root
', den die obige Antwort verwendet?Nur für den Fall, dass Sie diesen Pfad dem Git selbst zuführen, verwenden Sie
:/
quelle
Kurze Lösungen, die mit Submodulen, in Hooks und innerhalb des
.git
Verzeichnisses funktionierenHier ist die kurze Antwort, die die meisten wollen:
Dies funktioniert überall in einem Git-Arbeitsbaum (einschließlich innerhalb des
.git
Verzeichnisses), setzt jedoch voraus, dass Repository-Verzeichnisse aufgerufen werden.git
(dies ist die Standardeinstellung). Bei Submodulen geht dies zum Stammverzeichnis des äußersten Repositorys.Wenn Sie zum Stammverzeichnis des aktuellen Submoduls gelangen möchten, verwenden Sie:
Um einen Befehl in Ihrem Submodul-Stammverzeichnis einfach auszuführen , fügen Sie unter
[alias]
in Folgendes.gitconfig
hinzu:Dies ermöglicht es Ihnen, Dinge wie zu tun
git sh ag <string>
Robuste Lösung, die unterschiedlich benannte oder externe
.git
oder$GIT_DIR
Verzeichnisse unterstützt.Beachten Sie, dass dies
$GIT_DIR
möglicherweise auf eine externe Stelle verweist (und nicht aufgerufen werden kann.git
), weshalb weitere Überprüfungen erforderlich sind.Setzen Sie dies in Ihre
.bashrc
:Führen Sie es durch Eingabe
git_root
(nach der Shell neu zu starten:exec bash
)quelle
(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
Dies gilt jedoch nicht für externe$GIT_DIR
s, die einen anderen Namen haben als.git
Um die "git config" zu ändern, antworten Sie nur ein wenig:
und den Weg bereinigen lassen. Sehr schön.
quelle
Wenn Sie nach einem guten Alias suchen, um dies zu tun, und nicht in die Luft jagen,
cd
wenn Sie nicht in einem Git-Verzeichnis sind:quelle
git-extras
fügt hinzu,
$ git root
siehe https://github.com/tj/git-extras/blob/master/Commands.md#git-root
Verfügbarkeit von Git-Extras
$ brew install git-extras
$ apt-get install git-extras
quelle
Dieser Shell-Alias funktioniert unabhängig davon, ob Sie sich in einem Git-Unterverzeichnis oder auf der obersten Ebene befinden:
aktualisiert, um moderne Syntax anstelle von Backticks zu verwenden:
quelle
Alles andere schlägt irgendwann fehl, entweder im Home-Verzeichnis oder einfach nur kläglich. Dies ist der schnellste und kürzeste Weg, um zum GIT_DIR zurückzukehren.
quelle
$GIT_DIR
es mit.git
-Files und vom Arbeitsbaum getrennt wirdgitdir: SOMEPATH
. Folglich schlägt dies auch für Submodule fehl, die$GIT_DIR
enthalten.git/modules/SUBMODULEPATH
.Hier ist ein Skript, das ich geschrieben habe und das beide Fälle behandelt: 1) Repository mit einem Arbeitsbereich, 2) nacktes Repository.
https://gist.github.com/jdsumsion/6282953
git-root
(ausführbare Datei in Ihrem Pfad):Hoffentlich ist das hilfreich.
quelle
git exec
Idee in nicht nackten Repositories hilfreicher ist. Dieses Skript in meiner Antwort behandelt jedoch den bloßen und den nicht bloßen Fall korrekt, was für jemanden von Nutzen sein könnte. Daher lasse ich diese Antwort hier.git submodule
s fehl, wo so$GIT_DIR
etwas enthalten ist/.git/modules/SUBMODULE
. Sie gehen auch davon aus, dass das.git
Verzeichnis im nicht bloßen Fall Teil des Arbeitsbaums ist.quelle
[alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [
pwd]" && exit 0; cd .. && echo "IN
pwd" && f;}; f"
git config --global alias.root '!pwd'
funktioniert. Ich konnte keinen Fall erkennen, in dem es sich anders verhält als die nicht globale Variante. (Unix, Git 1.7.10.4) Übrigens: Siefindroot
benötigen eine/.git
, um eine endlose Rekursion zu vermeiden.Seit Git 2.13.0 wird eine neue Option zum Anzeigen des Pfads des Root-Projekts unterstützt, die auch dann funktioniert, wenn sie innerhalb eines Submoduls verwendet wird:
quelle
Vorkonfigurierte Shell-Aliase in Shell-Frameworks
Wenn Sie ein Shell-Framework verwenden, ist möglicherweise bereits ein Shell-Alias verfügbar:
$ grt
in oh-my-zsh (68k) (cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
in prezto (8.8k) (zeigt den Pfad zur Arbeitsbaumwurzel an)$ g..
zimfw (1k) (ändert das aktuelle Verzeichnis in die oberste Ebene des Arbeitsbaums.)quelle
Ich wollte auf Daniel Brockmans hervorragenden Kommentar eingehen.
Durch das Definieren
git config --global alias.exec '!exec '
können Sie Dinge tun, wie zumgit exec make
Beispielman git-config
:Es ist auch praktisch zu wissen, dass
$GIT_PREFIX
dies der Pfad zum aktuellen Verzeichnis relativ zum Verzeichnis der obersten Ebene eines Repositorys ist. Aber zu wissen, dass es nur die halbe Miete ist. Die Erweiterung der Shell-Variablen macht die Verwendung ziemlich schwierig. Also schlage ich vor,bash -c
wie folgt zu verwenden:Andere Befehle sind:
quelle
Falls jemand eine POSIX-kompatible Methode benötigt, ohne eine
git
ausführbare Datei zu benötigen :git-root
::Wenn Sie die Funktionalität nur als Teil eines Skripts verwenden möchten, entfernen Sie den Shebang und ersetzen Sie die letzte
git_root_recurse_parent
Zeile durch:quelle
if
Anweisung sollte überprüfen, ob Sie das Verzeichnis in der Rekursion geändert haben. Wenn es im selben Verzeichnis verbleibt, wird davon ausgegangen, dass Sie irgendwo stecken bleiben (z. B./
), und die Rekursion wird gebremst. Der Fehler ist behoben und sollte nun wie erwartet funktionieren. Vielen Dank für den Hinweis.Musste das heute selbst lösen. Es wurde in C # gelöst, da ich es für ein Programm brauchte, aber ich denke, es kann leicht umgeschrieben werden. Betrachten Sie diese Public Domain.
quelle