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 .git
cartelle 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 --bare
repository.
find / -name "*.git" -type d
name.git
solo una convenzione, che io, ad esempio, non seguo.
find
quei repository?
Repository Git hanno tutti HEAD
, refs
e objects
le voci.
su GNU / qualsiasi cosa,
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
Solo il controllo .git
mancherà 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/config
file 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 find
used (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
è true
se il nome corrisponde (spesso, ma non qui, con caratteri jolly)-exec
esegue un comando terminato da ;
(a cui viene fatto l'escape di \
per evitare l'interpretazione da parte della shell), ed è true
se lo stato di ritorno è 0
(cioè, OK). Il nodo corrente è disponibile come {}
(che non necessita di escape)-prune
è sempre true
e fa sì che tutti i nodi figlio vengano ignorati-type d
è true
per 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 ...
find
tutto 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