2017-06-01 1 views
3

Wenn ich an Projekten arbeite, die versionskontrolliert sind, lande ich oft in einem verschachtelten Ordner. Die Verwendung von cd ../../ wird ein wenig umständlich, also habe ich mich gefragt, ob es eine Möglichkeit gibt, einen Alias ​​in bash zu definieren, dass CD zu dem Eltern, bis es einen Ordner mit einem .git Ordner erreicht, oder es ~ erreicht.Wie kann ich in den nächsten übergeordneten Ordner wechseln, der einen .git-Ordner mit bash enthält?

Also lassen Sie uns sagen, dass

  • ~/my-project ein Git Repository ist
  • mein CWD ist ~/my-project/deeply/nested/folder/structure
  • ich den Befehl ausführen und bin cd'ed zu ~/my-project

Welche Befehl tun könnte Dies? Brauche ich eine Bash-Funktion?

Antwort

8

Der Befehl, nach dem Sie suchen, ist git rev-parse --show-toplevel, Sie können eine Bash-Funktion erstellen, die sie verwendet.

gr() { 
    cd "$(git rev-parse --show-toplevel)" 
} 

Ich habe auch in meinem ~/.gitconfig:

[alias] 
    root = rev-parse --show-toplevel 

Welche diesen Befehl ein wenig vernünftigen Suche macht.

3

Ich denke, die Antwort, die Sie bereits haben, ist gut (und möglicherweise effizienter), sondern eine grundlegende Art und Weise, dies zu erreichen wäre eine Schleife zu verwenden:

until [ -d .git ]; do cd ..; done 

Das heißt, bewegen sich in das übergeordnete Verzeichnis, bis die Verzeichnis .git existiert.

gegen eine Endlosschleife zu schützen, wenn Sie den Befehl von außerhalb eines git Repo laufen, könnten Sie eine grundlegende Überprüfung hinzufügen:

until [ -d .git ] || [ "$PWD" = "$p" ]; do p=$PWD; cd ..; done 

Ich bin nicht sicher, wie portable es ist, aber auf meinem System ich habe eine Variable $OLDPWD die stattdessen verwendet werden können:

until [ -d .git ] || [ "$PWD" = "$OLDPWD" ]; do cd ..; done 
+0

Die auf unbestimmte Zeit gehen würde, wenn es keine '.git' Datei im Baum war ... – blackghost

+0

Guter Punkt hatte ich nicht berücksichtigt dafür. Bearbeitet. –

0

Auch hier bereits beantwortet, aber ich habe ein Skript wie folgt das bedeutet im wesentlichen, dass:

#!/bin/bash 
filename=$1 
[[ ! ${filename} ]] && echo "no filename" && exit -1 
path=$(pwd) 
while [[ "${path}" != "" && ! -e ${path}/${filename} ]]; do 
    path=${path%/*} 
done 
[[ "${path}" == "" ]] && exit -1; 
cd ${path} 

wo würden Sie tun findup .git (die wiederum in einen Alias ​​gedreht werden könnte)

+0

Ich würde den ersten Test entweder auf '! ["$ filename"] ', oder wenn Sie nur bash-only wollen, dann' [[! $ Dateiname]] '. Sie können auch das '!' Löschen und '||' anstelle von '&&' verwenden. –

+0

Danke, ich habe es mit dem Bashismus aktualisiert. – blackghost

Verwandte Themen