¿Cómo puedo ver todos los repositorios de git en mi máquina?

121

¿Hay alguna forma en la que pueda ver todos los repositorios de git que existen en mi máquina? ¿Algún comando para eso?

n1kh1lp
fuente
2
Ver git-summary . Es un script bash que enumera todos los repositorios y genera su información de estado. Descargo de responsabilidad, soy uno de los desarrolladores.
cagliari2005
@ cagliari2005: ¿Qué pasa con los repositorios desnudos? stackoverflow.com/questions/60064170/…
Luciano

Respuestas:

102

Si está en Linux find / -name ".git", de lo contrario no hay forma, son directorios estándar, solo use el programa de búsqueda de archivos / carpetas de su sistema operativo para encontrar .gitcarpetas con nombre.

Arkaitz Jiménez
fuente
1
En Windows (y estoy seguro de que Mac también) podrías hacer algo similar ... solo una búsqueda de directorios llamados .git, que es lo que usa git para almacenar su metainformación.
cjstehno
3
En Mac, el comando anterior también funciona. (¡A menos que esté ejecutando OS9 o anterior!)
Alex Feinman
1
¿Algún buen script de shell o pequeña aplicación de utilidad que implemente esta funcionalidad de búsqueda de archivos simple y agregue información de estado del repositorio a la lista? No debería ser un problema escribir un script de shell para hacerlo, sino usar scripts bien adoptados que mis propios trucos no optimizados.
jmlane
6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken
Find man page tiene solución. Similar a la respuesta aceptada, pero usando -prune para regresar más rápido sin ingresar a los directorios .git. Sin podar, la búsqueda iría a la carpeta .git y, dependiendo del contenido, pasaría tiempo buscando en su interior innecesariamente. La solución de la página de manual sigue a "find repo / (-exec test -d '{}' /. Svn \; -o \ -exec test -d {} /. Git \; -o -exec test -d {} / CVS \ ;) \ -print -prune Compruébalo. Edita svn y cvs si no es necesario
quiet_penguin
38

RESPUESTA ORIGINAL : Esto funciona bastante bien desde Windows Powershell:

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

EDITAR # 1 : -Filter es dos veces más rápido que -Include. Aquí está esa solución:

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

EDICIÓN # 2 : Keith E. Truesdell mencionó el envío de la salida a un archivo. Vea su comentario para esa solución. Prefiero la salida de consola. Pero su comentario me hizo pensar que prefiero solo la ruta completa, no todo el desorden que se devuelve por defecto. Si desea que solo la ruta completa, use lo siguiente:

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

NOTA FINAL : Las soluciones anteriores solo devuelven repositorios de Git en el directorio actual . Si desea TODOS los repositorios en una unidad, debe ejecutar el comando una vez desde la raíz de cada unidad.

bopapa_1979
fuente
1
muy útil para los usuarios de Windows. :)
Felix Feliciant
2
Get-ChildItem: no se puede encontrar un parámetro que coincida con el nombre del parámetro 'Atributos'. En la línea: 1 carácter: 28
Dewald Swanepoel
@DewaldSwanepoel: no tengo ni idea de por qué verías ese error sobre el parámetro Atributos. Está claramente en la documentación y lo he probado ahora en varias combinaciones de versiones de Windows / PowerShell. Windows 7, 8 y 10 funcionan con varias versiones de PowerShell para mí. Si SI averigua por qué ocurre el error, compártelo aquí para que podamos aprender:>)
bopapa_1979
2
@DewaldSwanepoel: DEFINITIVAMENTE puede actualizar su versión de PowerShell. Lo hacemos con chocolate. Actualmente estoy ejecutando PowerShell versión 5.0 en Windows 7 en el trabajo.
bopapa_1979
1
@ KeithE.Truesdell - Estoy bastante seguro de que los atributos "Directory + Hidden" son inclusivos y solo buscarán directorios. Agregar -Directorio puede ser más rápido en versiones más recientes de PowerShell. Iré a cronometrarlo. EDITAR - Agregar el "-Directory" no hace ninguna diferencia material, como indica la documentación. Sin embargo, agregar el atributo de directorio como sugiere lo hace más lento. Ahora tengo una idea de por qué, pero lo probé en ambos sentidos con Measure-Command y los tres con el atributo Directory adicional fueron más lentos que los tres sin él.
bopapa_1979
18

En * nix, esto también encontrará --barerepositorios.

find / -name "*.git" -type d
gahooa
fuente
3
Los repositorios desnudos no necesitan ser nombrados, name.giteso es solo una convención, que yo, por ejemplo, no sigo.
Arkaitz Jimenez
3
Dado que los repositorios desnudos no necesitan seguir esa convención de nomenclatura, ¿existe una forma universal para findesos repositorios?
jmlane
11

Repositorios Git todos tienen HEAD, refsy objectslas entradas.

en GNU / cualquier cosa,

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

Con solo buscar, .gitse perderán muchos repositorios y submódulos.

Para volverse completamente paranoico con la verificación, puede pedirle a git que haga todas sus propias verificaciones antes de imprimir,

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

(editar: pensé que el .git/configarchivo era necesario, resulta que no lo es, por lo que el mínimo absoluto git init newrepoes

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

)

jthill
fuente
4

En Linux, una forma más rápida sería:

locate -r "\.git$"

asumiendo que mantiene actualizada la base de datos de localización con sudo updatedb

Ernesto
fuente
Definitivamente, localizar es más rápido, úselo
AjayKumarBasuthkar
3

En Linux y OS X, el siguiente comando es posiblemente el más rápido (ignorando los repositorios sin .git) cuando el directorio raíz de findes /:

find / -name .git -exec dirname {} \; -prune

Pero para las raíces que tienen en su mayoría repositorios debajo, la siguiente es probablemente la más rápida (es posible que desee reemplazarla /por .otra raíz):

find / -type d -exec test -d {}/.git \; -prune -print

Explicación rápida de los primarios de findusado (dado que aquí no hay operadores presentes, -andestá implícita, es decir, para cada nodo visitado los primarios se evalúan de izquierda a derecha hasta que uno de ellos evalúa false):

  • -namees truesi el nombre coincide (a menudo, pero no aquí, con comodines)
  • -execejecuta un comando terminado por ;(del cual se escapa \para evitar la interpretación del shell), y es truesi el estado de retorno es 0( es decir, OK). El nodo actual está disponible como {}(que no necesita escapar)
  • -prunees siempre true, y hace que se omitan todos los nodos secundarios
  • -type des truepara directorios
  • -printes necesario aquí porque si -execestá presente no se adjunta implícitamente
Walter Tross
fuente
2

En Linux, pruebe este comando con permiso de root:

find / | grep \\.git$

esto solo busca todos los archivos que terminan con .git ... puede hacerlo con herramientas de búsqueda en Windows, Linux, etc.

Michel Gokan
fuente
7
No tiene sentido dejar findsalir todo y luego filtrar con grep. Preferiría usar--name "*.git"
Gregory Pakosz
2
@ Gregory Pakosz: ¿Cuál es la diferencia?
Michel Gokan
11
@Michel, inicias 2 procesos y haces que el primero transmita a través de una tubería todo el /árbol para que el segundo lo haga grep, cuando el primero puede hacer todo y evitar el enorme uso inútil de IO. No es una diferencia real para el usuario normalmente, pero para grandes sistemas de archivos podría marcar la diferencia.
Arkaitz Jimenez
2
de todos modos, si desea usar SOLO el comando find, es mejor usar -regex en lugar de -name ... en este caso, use este comando: sudo find / -regex '. * \. git'
Michel Gokan
4
@MichelKogan mejor ¿por qué?
Mark Amery
2

Una versión simple de PowerShell:

Get-ChildItem . -Recurse -Hidden .git
Julien Brdy
fuente
1
¡Esto funcionó para mí! ¡Gracias! Recibí algunos errores para algunas ubicaciones a las que intenté acceder y que, al ejecutar como un usuario normal, el script de PowerShell no tenía acceso, pero luego de una revisión adicional, estos eran lugares de los que no debería preocuparme de todos modos (es decir, C:\users\<username>\PrintHood también, Me pareció útil agregar una salida a un archivo y, dado que solo me importaba la ruta (ya que este script obtiene mucha información), también filtrar solo la información de la ruta / directorio. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell
1

Para Linux:

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

Pequeña variación de la respuesta de Eric Burcham. Esa respuesta agrega \ .git al final, esta no.

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

Utilizo este comando al comienzo del día. Simplemente agrega algunos comandos git a los anteriores. Por alguna razón, nuestro repositorio de git funciona mejor si uno ejecuta una búsqueda y luego una extracción, no sé por qué. Y tenemos muchos submódulos por alguna razón. De todos modos, ponga lo que necesita entre las {}.

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
Nombre para mostrar
fuente