Come posso visualizzare tutti i repository git sulla mia macchina?


Risposte:


102

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.


1
Su Windows (e sono sicuro anche su Mac) potresti fare qualcosa di simile ... solo una ricerca di directory denominate .git - che è ciò che git usa per memorizzare le sue meta informazioni.
cjstehno

3
Su Mac, funziona anche il comando precedente. (A meno che tu non stia utilizzando OS9 o versioni precedenti!)
Alex Feinman

1
Qualche buon script di shell o piccole applicazioni di utilità che implementano questa semplice funzionalità di ricerca di file e aggiungono informazioni sullo stato del repository all'elenco? Non dovrebbe essere un problema scrivere uno script di shell per farlo, ma piuttosto usare script ben adottati piuttosto che i miei hack non ottimizzati.
jmlane

6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken

trovare la pagina man ha una soluzione. Simile alla risposta accettata, ma utilizzando -prune per tornare più velocemente senza entrare nelle directory .git. Senza prune find andrebbe nella cartella .git e, a seconda dei contenuti, spenderebbe del tempo a cercare inutilmente all'interno. La soluzione della pagina man segue "find repo / (-exec test -d '{}' /. Svn \; -or \ -exec test -d {} /. Git \; -o -exec test -d {} / CVS \ ;) \ -print -prune Controlla. Modifica svn e cvs se non richiesto
quiet_penguin

38

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


1
molto utile per gli utenti di Windows! :)
Felix Feliciant

2
Get-ChildItem: non è stato possibile trovare un parametro che corrisponde al nome del parametro "Attributi". In linea: 1 carattere: 28
Dewald Swanepoel

@DewaldSwanepoel - Non ho idea del motivo per cui dovresti vedere quell'errore sul parametro Attributes. È chiaramente nella documentazione e l'ho provato ora su diverse combinazioni di versioni di Windows / PowerShell. Windows 7, 8 e 10 funzionano tutti con varie versioni di PowerShell per me. Se scopri il motivo dell'errore, condividilo qui in modo che possiamo imparare:>)
bopapa_1979

2
@DewaldSwanepoel - Puoi SICURAMENTE aggiornare la tua versione di PowerShell. Lo facciamo con cioccolato. Al momento sto eseguendo PowerShell versione 5.0 su Windows 7 al lavoro.
bopapa_1979

1
@ KeithE.Truesdell - Sono abbastanza sicuro che gli attributi "Directory + Hidden" siano inclusivi e cercheranno solo nelle directory. L'aggiunta di -Directory potrebbe essere più veloce nelle versioni più recenti di PowerShell. Vado a tempo. EDIT - L'aggiunta di "-Directory" non fa alcuna differenza sostanziale, come indicherebbe la documentazione. Tuttavia, l'aggiunta dell'attributo Directory come suggerito lo rende più lento. Ora ho idea del perché, ma l'ho testato in entrambi i modi con Measure-Command e tutti e tre con l'attributo Directory aggiuntivo erano più lenti di tutti e tre senza.
bopapa_1979

18

Su * nix, questo troverà anche eventuali --barerepository.

find / -name "*.git" -type d

3
I repository nudi non hanno bisogno di essere nominati, è name.gitsolo una convenzione, che io, ad esempio, non seguo.
Arkaitz Jimenez

3
Dato che i repository nudi non devono seguire quella convenzione di denominazione, esiste un modo universale per findquei repository?
jmlane

11

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

)


4

Su Linux, un modo più veloce sarebbe:

locate -r "\.git$"

supponendo che tu mantenga aggiornato il database di Locate con sudo updatedb


Sicuramente, individuare è più veloce, usalo
AjayKumarBasuthkar

3

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 aggiunto

2

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


7
Non ha senso lasciare findtutto in output e poi filtrare con grep. Preferirei usare--name "*.git"
Gregory Pakosz

2
@ Gregory Pakosz: qual è la differenza?
Michel Gokan

11
@Michel, tu avvii 2 processi e fai in modo che il primo trasmetta attraverso una pipe l'intero /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.
Arkaitz Jimenez

2
in ogni caso, se vuoi usare il comando JUST find, è meglio usare -regex invece di -name ... in questo caso, usa questo comando: sudo find / -regex '. * \. git'
Michel Gokan

4
@MichelKogan meglio perché?
Mark Amery

2

Una semplice versione di PowerShell:

Get-ChildItem . -Recurse -Hidden .git

1
Questo ha funzionato per me! Grazie! Ho ricevuto alcuni errori per alcune posizioni in cui ho provato ad accedere a quelle in esecuzione come utente normale a cui lo script PowerShell non aveva accesso, ma dopo un'ulteriore revisione, questi erano luoghi di cui non avrei dovuto preoccuparmi comunque (cioè - 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
Keith E. Truesdell,

1

Per Linux:

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

1

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.