Gibt es eine Möglichkeit, alle auf meinem Computer vorhandenen Git-Repositorys anzuzeigen? Irgendein Befehl dafür?
Gibt es eine Möglichkeit, alle auf meinem Computer vorhandenen Git-Repositorys anzuzeigen? Irgendein Befehl dafür?
Antworten:
Wenn Sie unter Linux arbeiten find / -name ".git", andernfalls gibt es keine Möglichkeit, es handelt sich um Standardverzeichnisse. Verwenden Sie einfach Ihr Programm zum Suchen von Betriebssystemdateien / .gitOrdnern , um benannte Ordner zu finden .
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
ORIGINAL ANTWORT : Dies funktioniert ziemlich gut mit Windows Powershell:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse
EDIT # 1 : -Filter ist doppelt so schnell wie -Include. Hier ist diese Lösung:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse
EDIT # 2 : Keith E. Truesdell erwähnte das Senden der Ausgabe an eine Datei. Siehe seinen Kommentar zu dieser Lösung. Ich bevorzuge die Konsolenausgabe. Aber sein Kommentar brachte mich zu dem Gedanken, dass ich nur den vollständigen Pfad bevorzuge, nicht das ganze Durcheinander, das standardmäßig zurückgegeben wird. Wenn Sie möchten, dass nur der vollständige Pfad angezeigt wird, verwenden Sie Folgendes:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }
SCHLUSSBEMERKUNG : Die oben genannten Lösungen geben nur Git-Repositorys im aktuellen Verzeichnis zurück . Wenn Sie ALLE Repositorys auf einem Laufwerk haben möchten, sollten Sie den Befehl einmal im Stammverzeichnis jedes Laufwerks ausführen.
Unter * nix werden hier auch alle --bareRepositorys gefunden.
find / -name "*.git" -type d
name.gitNackte Repositories müssen nicht benannt werden, das ist nur eine Konvention, der ich zum Beispiel nicht folge.
finddiesen Repos , da nackte Repositorys dieser Namenskonvention nicht folgen müssen ?
Git - Repositories alle haben HEAD, refsund objectsEinträge.
auf GNU / irgendetwas,
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
Wenn Sie nur nachsehen, .gitwerden viele nackte Repos und Submodule fehlen.
Um die Prüfung vollständig paranoid zu machen, können Sie git bitten, vor dem Drucken alle eigenen Prüfungen durchzuführen.
find -name HEAD -execdir test -e refs -a -e objects \; \
-execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;
(Bearbeiten: Ich dachte, die .git/configDatei wäre notwendig, stellt sich heraus, dass dies nicht der Fall git init newrepoist , also ist das absolute Minimum
mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
Unter Linux wäre ein schnellerer Weg:
locate -r "\.git$"
Angenommen, Sie halten die Datenbank von locate mit auf dem neuesten Stand sudo updatedb
Unter Linux und OS X ist der folgende Befehl möglicherweise der schnellste (ohne Repositorys zu ignorieren .git), wenn das Stammverzeichnis von findlautet /:
find / -name .git -exec dirname {} \; -prune
Aber für Wurzeln , die meist Repositorys unterhalb haben, ist die folgende wahrscheinlich die schnellste (Sie können ersetzen möchten /mit .oder eine andere Wurzel):
find / -type d -exec test -d {}/.git \; -prune -print
Kurze Erklärung der Vorwahlen der findverwendet wird (da keine Betreiber hier anwesend sind, -andist implizit, dh für jede besuchte Knoten Vorwahlen sind links nach rechts ausgewertet , bis einer von ihnen ausgewertet false):
-nameist, truewenn der Name übereinstimmt (oft, aber nicht hier, mit Platzhaltern)-execführt einen Befehl aus, der von beendet wird ;(der von maskiert wird \, um eine Interpretation durch die Shell zu vermeiden), und ist, truewenn der Rückgabestatus 0(dh OK) ist. Der aktuelle Knoten ist verfügbar als {}(der kein Escape benötigt)-pruneist immer trueund bewirkt, dass alle untergeordneten Knoten übersprungen werden-type dist truefür Verzeichnisse-printwird hier benötigt, da es, falls -execvorhanden, nicht implizit angehängt wirdVersuchen Sie unter Linux diesen Befehl mit Root-Berechtigung:
find / | grep \\.git$
Dies durchsucht nur alle Dateien, die mit .git enden. Sie können dies mit Suchwerkzeugen unter Windows, Linux usw. tun.
findalles ausgeben zu lassen und dann mit zu filtern grep. Ich würde lieber verwenden--name "*.git"
/Baum übertragen, damit der zweite grep, wenn der erste alles kann und die riesige nutzlose E / A-Nutzung vermeidet. Normalerweise kein wirklicher Unterschied für den Benutzer, aber für große Dateisysteme kann dies einen Unterschied machen.
Eine einfache PowerShell-Version:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood auch ich fand es nützlich, einer Datei eine Ausgabe hinzuzufügen, und da ich mich nur um den Pfad kümmerte (da dieses Skript eine Reihe von Informationen enthält), um auch nur nach den Pfad- / Verzeichnisinformationen zu filtern. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Für Linux:
dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo
Kleine Abweichung von Eric Burchams Antwort. Diese Antwort fügt \ .git zum Ende hinzu, diese nicht.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }
Ich benutze diesen Befehl am Anfang des Tages. Es werden einfach ein paar Git-Befehle zu den obigen hinzugefügt. Aus irgendeinem Grund funktioniert unser Git-Repository am besten, wenn man einen Abruf ausführt und dann zieht. Ich weiß nicht warum. Und wir haben aus irgendeinem Grund viele Submodule. Wie auch immer, setzen Sie das, was Sie brauchen, zwischen die {}.
push-location; Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { cd $_.parent.fullname; write-host '*************'; $(get-location).path; git fetch; git pull; git checkout .; git clean -f; git submodule update; git status; write-host '*************'; write-host ' '; }; pop-location