Siehe Git-Zusammenfassung . Es ist ein Bash-Skript, das alle Repositorys auflistet und ihre Statusinformationen ausgibt. Haftungsausschluss, ich bin einer der Entwickler.
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 .
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:
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:
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.
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.
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
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
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'
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
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 {}.
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 /.git
Ordnern , um benannte Ordner zu finden .quelle
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
ORIGINAL ANTWORT : Dies funktioniert ziemlich gut mit Windows Powershell:
EDIT # 1 : -Filter ist doppelt so schnell wie -Include. Hier ist diese Lösung:
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:
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.
quelle
Unter * nix werden hier auch alle
--bare
Repositorys gefunden.quelle
name.git
Nackte Repositories müssen nicht benannt werden, das ist nur eine Konvention, der ich zum Beispiel nicht folge.find
diesen Repos , da nackte Repositorys dieser Namenskonvention nicht folgen müssen ?Git - Repositories alle haben
HEAD
,refs
undobjects
Einträge.auf GNU / irgendetwas,
Wenn Sie nur nachsehen,
.git
werden 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.
(Bearbeiten: Ich dachte, die
.git/config
Datei wäre notwendig, stellt sich heraus, dass dies nicht der Fallgit init newrepo
ist , also ist das absolute Minimum)
quelle
Unter Linux wäre ein schnellerer Weg:
locate -r "\.git$"
Angenommen, Sie halten die Datenbank von locate mit auf dem neuesten Stand
sudo updatedb
quelle
Unter Linux und OS X ist der folgende Befehl möglicherweise der schnellste (ohne Repositorys zu ignorieren
.git
), wenn das Stammverzeichnis vonfind
lautet/
: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):Kurze Erklärung der Vorwahlen der
find
verwendet wird (da keine Betreiber hier anwesend sind,-and
ist implizit, dh für jede besuchte Knoten Vorwahlen sind links nach rechts ausgewertet , bis einer von ihnen ausgewertetfalse
):-name
ist,true
wenn der Name übereinstimmt (oft, aber nicht hier, mit Platzhaltern)-exec
führt einen Befehl aus, der von beendet wird;
(der von maskiert wird\
, um eine Interpretation durch die Shell zu vermeiden), und ist,true
wenn der Rückgabestatus0
(dh OK) ist. Der aktuelle Knoten ist verfügbar als{}
(der kein Escape benötigt)-prune
ist immertrue
und bewirkt, dass alle untergeordneten Knoten übersprungen werden-type d
isttrue
für Verzeichnisse-print
wird hier benötigt, da es, falls-exec
vorhanden, nicht implizit angehängt wirdquelle
Versuchen Sie unter Linux diesen Befehl mit Root-Berechtigung:
Dies durchsucht nur alle Dateien, die mit .git enden. Sie können dies mit Suchwerkzeugen unter Windows, Linux usw. tun.
quelle
find
alles ausgeben zu lassen und dann mit zu filterngrep
. 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:
quelle
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:
quelle
Kleine Abweichung von Eric Burchams Antwort. Diese Antwort fügt \ .git zum Ende hinzu, diese nicht.
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 {}.
quelle