Zobacz podsumowanie git . Jest to skrypt bash, który wyświetla listę wszystkich repozytoriów i wyświetla informacje o ich statusie. Uwaga, jestem jednym z deweloperów.
Jeśli jesteś w systemie Linux find / -name ".git", w przeciwnym razie nie ma sposobu, są to standardowe katalogi, po prostu użyj programu do wyszukiwania plików / folderów systemu operacyjnego, aby znaleźć .gitnazwane foldery.
W systemie Windows (i jestem pewien, że również na Macu) możesz zrobić coś podobnego ... po prostu wyszukać katalogi o nazwie .git - czyli to, czego używa git do przechowywania metainformacji.
cjstehno,
3
Na komputerach Mac powyższe polecenie działa również. (Chyba że używasz OS9 lub starszego!)
Alex Feinman
1
Jakieś dobre skrypty powłoki lub małe aplikacje narzędziowe, które implementują tę prostą funkcję wyszukiwania plików i dodają informacje o stanie repozytorium do listy? Nie powinno być problemu z napisaniem skryptu powłoki, aby to zrobić, ale raczej używaj dobrze przyjętych skryptów niż moich własnych niezoptymalizowanych hacków.
jmlane
6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken
Znajdź stronę podręcznika man ma rozwiązanie. Podobna do zaakceptowanej odpowiedzi, ale używająca -prune, aby wrócić szybciej bez wchodzenia do katalogów .git. Bez śliwki find przeszedłby do folderu .git iw zależności od zawartości spędzałby czas na przeszukiwaniu wnętrza. Rozwiązanie strony podręcznika następuje po „find repo / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -or -exec test -d {} / CVS \ ;) \ -print -prune Sprawdź to. Edytuj svn i cvs, jeśli nie są wymagane
quiet_penguin
38
ORYGINALNA ODPOWIEDŹ : Działa to całkiem nieźle z Windows Powershell:
EDYCJA # 2 : Keith E. Truesdell wspomniał o wysyłaniu wyników do pliku. Zobacz jego komentarz dotyczący tego rozwiązania. Wolę wyjście konsoli. Ale jego komentarz sprawił, że pomyślałem, że wolę tylko pełną ścieżkę, a nie cały bałagan, który jest domyślnie zwracany. Jeśli chcesz, aby była to tylko pełna ścieżka, użyj następujących:
UWAGA KOŃCOWA : powyższe rozwiązania zwracają tylko repozytoria Git w bieżącym katalogu . Jeśli chcesz, aby WSZYSTKIE repozytoria znajdowały się na dysku, powinieneś uruchomić polecenie raz z katalogu głównego każdego dysku.
bardzo przydatne dla użytkowników systemu Windows! :)
Felix Feliciant
2
Get-ChildItem: nie można znaleźć parametru zgodnego z nazwą parametru „Attributes”. Na linii: 1 zwęglać: 28
Dewald Swanepoel
@DewaldSwanepoel - Nie mam pojęcia, dlaczego miałbyś zobaczyć ten błąd dotyczący parametru Attributes. Jest to wyraźnie w dokumentacji i wypróbowałem to teraz w kilku kombinacjach wersji Windows / PowerShell. Windows 7, 8 i 10 działają dla mnie z różnymi wersjami programu PowerShell. Jeśli
DOWIEDZ SIĘ
2
@DewaldSwanepoel - Możesz ZDECYDOWANIE zaktualizować swoją wersję PowerShell. Robimy to z czekoladą. Obecnie używam programu PowerShell w wersji 5.0 w systemie Windows 7 w pracy.
bopapa_1979
1
@ KeithE.Truesdell - Jestem prawie pewien, że atrybuty „Directory + Hidden” obejmują tylko katalogi. Dodanie -Directory my be szybciej w nowszych wersjach PowerShell. Pójdę na to czas. EDYCJA - Dodanie „-Directory” nie powoduje żadnej istotnej różnicy, jak wskazywałaby dokumentacja. Jednak dodanie atrybutu katalogu zgodnie z sugestią spowolni go. Teraz mam pojęcie, dlaczego, ale przetestowałem to w obie strony z Measure-Command i wszystkie trzy z dodatkowym atrybutem Directory były wolniejsze niż wszystkie trzy bez.
bopapa_1979
18
Na * nix spowoduje to również znalezienie --barerepozytoriów.
W systemie Linux i OS X następujące polecenie jest prawdopodobnie najszybsze (ignorując repozytoria bez .git), gdy katalog główny findto /:
find / -name .git -exec dirname {} \; -prune
Ale w przypadku katalogów głównych, które mają większość repozytoriów pod spodem, prawdopodobnie najszybszy jest następujący sposób (możesz chcieć zastąpić /go .lub innym katalogiem głównym):
find / -type d -exec test -d {}/.git \; -prune -print
Szybkie wyjaśnienie prawyborach o findużywane (ponieważ żadne podmioty są obecne tu -andjest niejawny, czyli dla każdego odwiedzanych węzłów prawybory są oceniane od lewej do prawej, aż jeden z nich ma wartość false):
-namejest, truejeśli nazwa pasuje (często, ale nie tutaj, z symbolami wieloznacznymi)
-execwykonuje polecenie zakończone przez ;(które jest chronione przed \interpretacją przez powłokę) i jest wykonywane, truejeśli stan powrotu to 0(tj. OK). Bieżący węzeł jest dostępny jako {}(co nie wymaga zmiany znaczenia)
-prunejest zawsze truei powoduje, że wszystkie węzły potomne są pomijane
-type ddotyczy truekatalogów
-printjest tu potrzebne, ponieważ jeśli -execwystępuje, nie jest dołączane niejawnie
Nie ma sensu pozwalać na findwyświetlanie wszystkiego, a następnie filtrowanie za pomocą grep. Wolałbym raczej użyć--name "*.git"
Gregory Pakosz
2
@Gregory Pakosz: Jaka jest różnica?
Michel Gokan,
11
@Michel, uruchamiasz 2 procesy i sprawiasz, że pierwszy transmituje przez potok całe /drzewo, aby drugi mógł grep, kiedy pierwszy może zrobić wszystko i uniknąć ogromnego bezużytecznego użycia IO. Zwykle nie ma to większego znaczenia dla użytkownika, ale w przypadku dużych systemów plików może to mieć znaczenie.
Arkaitz Jimenez
2
w każdym razie, jeśli chcesz użyć polecenia JUST find, lepiej użyć -regex zamiast -name ... w tym przypadku użyj tego polecenia: sudo find / -regex '. * \. git'
To zadziałało dla mnie! Dziękuję Ci! Wystąpiły błędy dla kilku lokalizacji, do których próbowałem uzyskać dostęp, do których skrypt PowerShell nie miał dostępu, działając jako zwykły użytkownik, ale po dalszej analizie były to miejsca, o które i tak nie powinienem się martwić (tj. - C:\users\<username>\PrintHood Również ja uznał za przydatne dodanie wyjścia do pliku, a ponieważ dbałem tylko o ścieżkę (ponieważ ten skrypt pobiera kilka informacji), filtrowanie również tylko dla informacji o ścieżce / katalogu. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Używam tego polecenia na początku dnia. Po prostu dodaje kilka poleceń git do powyższego. Z jakiegoś powodu nasze repozytorium git działa najlepiej, jeśli uruchamia się pobieranie, a następnie ściąganie, nie wiem dlaczego. Z jakiegoś powodu mamy wiele modułów podrzędnych. W każdym razie, umieść to, czego potrzebujesz, między {}.
Odpowiedzi:
Jeśli jesteś w systemie Linux
find / -name ".git"
, w przeciwnym razie nie ma sposobu, są to standardowe katalogi, po prostu użyj programu do wyszukiwania plików / folderów systemu operacyjnego, aby znaleźć.git
nazwane foldery.źródło
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
ORYGINALNA ODPOWIEDŹ : Działa to całkiem nieźle z Windows Powershell:
EDYCJA # 1 : -Filtr jest dwa razy szybszy niż -Włącz. Oto takie rozwiązanie:
EDYCJA # 2 : Keith E. Truesdell wspomniał o wysyłaniu wyników do pliku. Zobacz jego komentarz dotyczący tego rozwiązania. Wolę wyjście konsoli. Ale jego komentarz sprawił, że pomyślałem, że wolę tylko pełną ścieżkę, a nie cały bałagan, który jest domyślnie zwracany. Jeśli chcesz, aby była to tylko pełna ścieżka, użyj następujących:
UWAGA KOŃCOWA : powyższe rozwiązania zwracają tylko repozytoria Git w bieżącym katalogu . Jeśli chcesz, aby WSZYSTKIE repozytoria znajdowały się na dysku, powinieneś uruchomić polecenie raz z katalogu głównego każdego dysku.
źródło
Na * nix spowoduje to również znalezienie
--bare
repozytoriów.źródło
name.git
to tylko konwencja, której ja na przykład nie przestrzegam.find
te repozytoria ?Repozytoria git wszyscy mają
HEAD
,refs
aobjects
wpisy.na GNU / cokolwiek,
Samo sprawdzenie
.git
spowoduje pominięcie wielu gołych repozytoriów i modułów podrzędnych.Aby przejść w pełną paranoję podczas sprawdzania, możesz poprosić gita o wykonanie wszystkich kontroli przed wydrukowaniem,
(edycja: myślałem, że
.git/config
plik jest potrzebny, okazuje się, że nie, więc absolutne minimumgit init newrepo
to)
źródło
W systemie Linux szybszym sposobem byłoby:
locate -r "\.git$"
zakładając, że baza danych locate jest aktualizowana za pomocą
sudo updatedb
źródło
W systemie Linux i OS X następujące polecenie jest prawdopodobnie najszybsze (ignorując repozytoria bez
.git
), gdy katalog głównyfind
to/
:Ale w przypadku katalogów głównych, które mają większość repozytoriów pod spodem, prawdopodobnie najszybszy jest następujący sposób (możesz chcieć zastąpić
/
go.
lub innym katalogiem głównym):Szybkie wyjaśnienie prawyborach o
find
używane (ponieważ żadne podmioty są obecne tu-and
jest niejawny, czyli dla każdego odwiedzanych węzłów prawybory są oceniane od lewej do prawej, aż jeden z nich ma wartośćfalse
):-name
jest,true
jeśli nazwa pasuje (często, ale nie tutaj, z symbolami wieloznacznymi)-exec
wykonuje polecenie zakończone przez;
(które jest chronione przed\
interpretacją przez powłokę) i jest wykonywane,true
jeśli stan powrotu to0
(tj. OK). Bieżący węzeł jest dostępny jako{}
(co nie wymaga zmiany znaczenia)-prune
jest zawszetrue
i powoduje, że wszystkie węzły potomne są pomijane-type d
dotyczytrue
katalogów-print
jest tu potrzebne, ponieważ jeśli-exec
występuje, nie jest dołączane niejawnieźródło
W systemie Linux wypróbuj to polecenie z uprawnieniami administratora:
to po prostu przeszukuje wszystkie pliki kończące się na .git ... możesz to zrobić za pomocą narzędzi wyszukiwania w systemie Windows, Linux itp ...
źródło
find
wyświetlanie wszystkiego, a następnie filtrowanie za pomocągrep
. Wolałbym raczej użyć--name "*.git"
/
drzewo, aby drugi mógł grep, kiedy pierwszy może zrobić wszystko i uniknąć ogromnego bezużytecznego użycia IO. Zwykle nie ma to większego znaczenia dla użytkownika, ale w przypadku dużych systemów plików może to mieć znaczenie.Prosta wersja PowerShell:
źródło
C:\users\<username>\PrintHood
Również ja uznał za przydatne dodanie wyjścia do pliku, a ponieważ dbałem tylko o ścieżkę (ponieważ ten skrypt pobiera kilka informacji), filtrowanie również tylko dla informacji o ścieżce / katalogu.Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
W systemie Linux:
źródło
Niewielkie odstępstwo od odpowiedzi Erica Burchama. Ta odpowiedź dodaje \ .git na koniec, ta nie.
Używam tego polecenia na początku dnia. Po prostu dodaje kilka poleceń git do powyższego. Z jakiegoś powodu nasze repozytorium git działa najlepiej, jeśli uruchamia się pobieranie, a następnie ściąganie, nie wiem dlaczego. Z jakiegoś powodu mamy wiele modułów podrzędnych. W każdym razie, umieść to, czego potrzebujesz, między {}.
źródło