Wie kann ich alle Git-Repositorys auf meinem Computer anzeigen?

121

Gibt es eine Möglichkeit, alle auf meinem Computer vorhandenen Git-Repositorys anzuzeigen? Irgendein Befehl dafür?

n1kh1lp
quelle
2
Siehe Git-Zusammenfassung . Es ist ein Bash-Skript, das alle Repositorys auflistet und ihre Statusinformationen ausgibt. Haftungsausschluss, ich bin einer der Entwickler.
cagliari2005
@ cagliari2005: Was ist mit nackten Repositories? stackoverflow.com/questions/60064170/…
Luciano

Antworten:

102

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 .

Arkaitz Jimenez
quelle
1
Unter Windows (und ich bin sicher auch unter Mac) könnten Sie etwas Ähnliches tun ... nur nach Verzeichnissen mit dem Namen .git suchen - das ist, was git verwendet, um seine Metainformationen zu speichern.
cjstehno
3
Auf Macs funktioniert der obige Befehl auch. (Es sei denn, Sie verwenden OS9 oder früher!)
Alex Feinman
1
Gibt es gute Shell-Skripte oder kleine Dienstprogramme, die diese einfache Dateisuchfunktion implementieren und der Liste Informationen zum Repository-Status hinzufügen? Es sollte kein Problem sein, ein Shell-Skript zu schreiben, sondern gut angenommene Skripte als meine eigenen nicht optimierten Hacks zu verwenden.
Jmlane
6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken
Manpage finden hat Lösung. Ähnlich wie bei der akzeptierten Antwort, jedoch mit -prune, um schneller zurückzukehren, ohne in die .git-Verzeichnisse zu wechseln. Ohne Bereinigung würde die Suche in den Ordner .git gehen und je nach Inhalt unnötig Zeit damit verbringen, darin zu suchen. Die Manpage-Lösung folgt "find repo / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -oder -exec test -d {} / CVS \ ;) \ -print -prune Check it out. Bearbeiten Sie svn und cvs, wenn nicht erforderlich
quiet_penguin
38

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.

bopapa_1979
quelle
1
sehr nützlich für Windows-Benutzer! :)
Felix Feliciant
2
Get-ChildItem: Es wurde kein Parameter gefunden, der dem Parameternamen 'Attribute' entspricht. In der Zeile: 1 Zeichen: 28
Dewald Swanepoel
@ DewaldSwanepoel - Ich habe keine Ahnung, warum dieser Fehler beim Parameter Attributes angezeigt wird. Es ist eindeutig in der Dokumentation enthalten, und ich habe es jetzt mit mehreren Windows / PowerShell-Versionskombinationen versucht. Windows 7, 8 und 10 funktionieren für mich alle mit verschiedenen Versionen von PowerShell. Wenn Sie herausfinden, warum der Fehler auftritt, teilen Sie ihn bitte hier mit, damit wir erfahren können:>)
bopapa_1979
2
@DewaldSwanepoel - Sie können Ihre PowerShell-Version ENDGÜLTIG aktualisieren. Wir machen es mit Schokolade. Ich verwende derzeit PowerShell Version 5.0 unter Windows 7 bei der Arbeit.
bopapa_1979
1
@ KeithE.Truesdell - Ich bin mir ziemlich sicher, dass die Attribute "Verzeichnis + Versteckt" inklusive sind und nur Verzeichnisse durchsuchen. Das Hinzufügen von -Directory kann in neueren Versionen von PowerShell schneller sein. Ich werde es mal gehen. BEARBEITEN - Das Hinzufügen des "-Verzeichnisses" macht keinen wesentlichen Unterschied, wie aus der Dokumentation hervorgeht. Wenn Sie jedoch das von Ihnen vorgeschlagene Verzeichnisattribut hinzufügen, wird es langsamer. Ich habe jetzt eine Idee warum, aber ich habe es in beide Richtungen mit Measure-Command getestet und alle drei mit dem zusätzlichen Directory-Attribut waren langsamer als alle drei ohne.
bopapa_1979
18

Unter * nix werden hier auch alle --bareRepositorys gefunden.

find / -name "*.git" -type d
gahooa
quelle
3
name.gitNackte Repositories müssen nicht benannt werden, das ist nur eine Konvention, der ich zum Beispiel nicht folge.
Arkaitz Jimenez
3
Gibt es einen universellen Weg zu finddiesen Repos , da nackte Repositorys dieser Namenskonvention nicht folgen müssen ?
Jmlane
11

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

)

jthill
quelle
4

Unter Linux wäre ein schnellerer Weg:

locate -r "\.git$"

Angenommen, Sie halten die Datenbank von locate mit auf dem neuesten Stand sudo updatedb

Ernesto
quelle
Auf jeden Fall ist das Auffinden schneller, verwenden Sie es mit Vorsichtsmaßnahmen, siehe hier: unix.stackexchange.com/questions/60205/…
AjayKumarBasuthkar
3

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 wird
Walter Tross
quelle
2

Versuchen 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.

Michel Gokan
quelle
7
Es macht keinen Sinn, findalles ausgeben zu lassen und dann mit zu filtern grep. Ich würde lieber verwenden--name "*.git"
Gregory Pakosz
2
@ Gregory Pakosz: Was ist der Unterschied?
Michel Gokan
11
@Michel, du startest 2 Prozesse und lässt den ersten durch eine Pipe den gesamten /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.
Arkaitz Jimenez
2
Wenn Sie den Befehl JUST find verwenden möchten, ist es besser, -regex anstelle von -name zu verwenden. In diesem Fall verwenden Sie diesen Befehl: sudo find / -regex '. * \. git'
Michel Gokan
4
@ MichaelKogan besser warum?
Mark Amery
2

Eine einfache PowerShell-Version:

Get-ChildItem . -Recurse -Hidden .git
Julien Brdy
quelle
1
Das hat bei mir funktioniert! Danke dir! Ich habe einige Fehler für einige Stellen erhalten, auf die versucht wurde, auf das zuzugreifen, auf das das Powershell-Skript als normaler Benutzer keinen Zugriff hatte, aber nach weiterer Überprüfung waren dies Orte, um die ich mir sowieso keine Sorgen machen sollte (dh - 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
Keith E. Truesdell
1

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 
Vor dem Gesetz
quelle
1

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
Anzeigename
quelle