C'è un modo in cui posso vedere tutti i repository git che esistono sulla mia macchina? Qualche comando per quello?
C'è un modo in cui posso vedere tutti i repository git che esistono sulla mia macchina? Qualche comando per quello?
Risposte:
Se sei in Linux find / -name ".git", altrimenti non c'è modo, sono directory standard, usa semplicemente il programma di ricerca file / cartelle del tuo sistema operativo per trovare le .gitcartelle con nome.
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
RISPOSTA ORIGINALE : Funziona abbastanza bene da Windows Powershell:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse
EDIT # 1 : -Filter è due volte più veloce di -Include. Ecco quella soluzione:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse
EDIT # 2 : Keith E. Truesdell ha menzionato l'invio dell'output a un file. Vedere il suo commento per quella soluzione. Preferisco l'output su console. Ma il suo commento mi ha fatto pensare che preferisco solo il percorso completo, non l'intero pasticcio che viene restituito per impostazione predefinita. Se vuoi solo il percorso completo, utilizza quanto segue:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }
NOTA FINALE : le soluzioni precedenti restituiscono solo i repository Git nella directory corrente . Se desideri TUTTI i repository su un'unità, devi eseguire il comando una volta dalla radice di ciascuna unità.
Su * nix, questo troverà anche eventuali --barerepository.
find / -name "*.git" -type d
name.gitsolo una convenzione, che io, ad esempio, non seguo.
findquei repository?
Repository Git hanno tutti HEAD, refse objectsle voci.
su GNU / qualsiasi cosa,
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
Solo il controllo .gitmancherà molti repository e sottomoduli nudi.
Per diventare completamente paranoico sul controllo puoi chiedere a git di fare tutti i suoi controlli prima di stampare,
find -name HEAD -execdir test -e refs -a -e objects \; \
-execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;
(modifica: pensavo che il .git/configfile fosse necessario, risulta che non lo è, quindi il minimo assoluto git init newrepoè
mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
Su Linux, un modo più veloce sarebbe:
locate -r "\.git$"
supponendo che tu mantenga aggiornato il database di Locate con sudo updatedb
Su Linux e OS X il seguente comando è probabilmente il più veloce (ignorando i repository senza .git) quando la directory root di findè /:
find / -name .git -exec dirname {} \; -prune
Ma per le radici che hanno principalmente repository sottostanti, il seguente è probabilmente il più veloce (potresti voler sostituire /con .o un'altra radice):
find / -type d -exec test -d {}/.git \; -prune -print
Rapida spiegazione dei primari di findused (poiché qui non sono presenti operatori , -andè implicito, cioè, per ogni nodo visitato i primari vengono valutati da sinistra a destra fino a quando uno di essi restituisce false):
-nameè truese il nome corrisponde (spesso, ma non qui, con caratteri jolly)-execesegue un comando terminato da ;(a cui viene fatto l'escape di \per evitare l'interpretazione da parte della shell), ed è truese lo stato di ritorno è 0(cioè, OK). Il nodo corrente è disponibile come {}(che non necessita di escape)-pruneè sempre truee fa sì che tutti i nodi figlio vengano ignorati-type dè trueper le directory-printè necessario qui perché se -execè presente non è implicitamente aggiuntoSu Linux, prova questo comando con l'autorizzazione di root:
find / | grep \\.git$
questo cerca solo tutti i file che terminano con .git ... puoi farlo con gli strumenti di ricerca in Windows, Linux ecc ...
findtutto in output e poi filtrare con grep. Preferirei usare--name "*.git"
/albero per il secondo a grep, quando il primo può fare tutto ed evitare l'enorme inutile utilizzo di IO. Normalmente non una vera differenza per l'utente, ma per grandi filesystem potrebbe fare la differenza.
Una semplice versione di PowerShell:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood Inoltre, io ho trovato utile aggiungere un output a un file e dal momento che mi interessava solo il percorso (poiché questo script riceve un mucchio di informazioni) filtrare anche solo per le informazioni sul percorso / directory. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Per Linux:
dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo
Piccola variazione dalla risposta di Eric Burcham. Quella risposta aggiunge \ .git alla fine, questa no.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }
Uso questo comando all'inizio della giornata. Aggiunge semplicemente alcuni comandi git a quanto sopra. Per qualche ragione, il nostro repository git funziona meglio se si esegue un fetch e poi un pull, non so perché. E abbiamo molti sottomoduli per qualche motivo. Ad ogni modo, metti quello che ti serve tra le {}.
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