Jak mogę wyświetlić wszystkie repozytoria git na moim komputerze?

121

Czy istnieje sposób, w jaki mogę zobaczyć wszystkie repozytoria git istniejące na moim komputerze? Jakieś polecenie?

n1kh1lp
źródło
2
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.
cagliari
@ cagliari2005: A co z gołymi repozytoriami? stackoverflow.com/questions/60064170/…
Luciano

Odpowiedzi:

102

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.

Arkaitz Jimenez
źródło
1
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:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse

EDYCJA # 1 : -Filtr jest dwa razy szybszy niż -Włącz. Oto takie rozwiązanie:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse

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:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }

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.

bopapa_1979
źródło
1
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.

find / -name "*.git" -type d
gahooa
źródło
3
Samych repozytoriów nie trzeba nazywać, name.gitto tylko konwencja, której ja na przykład nie przestrzegam.
Arkaitz Jimenez
3
Biorąc pod uwagę, że same repozytoria nie muszą przestrzegać tej konwencji nazewnictwa, czy istnieje uniwersalny sposób na findte repozytoria ?
jmlane
11

Repozytoria git wszyscy mają HEAD, refsa objectswpisy.

na GNU / cokolwiek,

find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n

Samo sprawdzenie .gitspowoduje 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,

find -name HEAD -execdir test -e refs -a -e objects \; \
      -execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;

(edycja: myślałem, że .git/configplik jest potrzebny, okazuje się, że nie, więc absolutne minimum git init newrepoto

mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD

)

jthill
źródło
4

W systemie Linux szybszym sposobem byłoby:

locate -r "\.git$"

zakładając, że baza danych locate jest aktualizowana za pomocą sudo updatedb

Ernesto
źródło
Zdecydowanie lokalizowanie jest szybsze, używaj go z ostrożnością, patrz tutaj: unix.stackexchange.com/questions/60205/…
AjayKumarBasuthkar
3

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
Walter Tross
źródło
2

W systemie Linux wypróbuj to polecenie z uprawnieniami administratora:

find / | grep \\.git$

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

Michel Gokan
źródło
7
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'
Michel Gokan
4
@MichelKogan lepiej dlaczego?
Mark Amery,
2

Prosta wersja PowerShell:

Get-ChildItem . -Recurse -Hidden .git
Julien Brdy
źródło
1
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
Keith E. Truesdell
1

W systemie Linux:

dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo 
InLaw
źródło
1

Niewielkie odstępstwo od odpowiedzi Erica Burchama. Ta odpowiedź dodaje \ .git na koniec, ta nie.

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }

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 {}.

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
Wyświetlana nazwa
źródło