Czy istnieje sposób, w jaki mogę zobaczyć wszystkie repozytoria git istniejące na moim komputerze? Jakieś polecenie?
Czy istnieje sposób, w jaki mogę zobaczyć wszystkie repozytoria git istniejące na moim komputerze? Jakieś polecenie?
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źć .gitnazwane foldery.
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:
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.
Na * nix spowoduje to również znalezienie --barerepozytoriów.
find / -name "*.git" -type d
name.gitto tylko konwencja, której ja na przykład nie przestrzegam.
findte repozytoria ?
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
)
W systemie Linux szybszym sposobem byłoby:
locate -r "\.git$"
zakładając, że baza danych locate jest aktualizowana za pomocą sudo updatedb
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 niejawnieW 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 ...
findwyś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:
Get-ChildItem . -Recurse -Hidden .git
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
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