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.
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.
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:
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:
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.
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.
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
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'
¡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
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 {}.
Respuestas:
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.git
carpetas con nombre.fuente
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
RESPUESTA ORIGINAL : Esto funciona bastante bien desde Windows Powershell:
EDITAR # 1 : -Filter es dos veces más rápido que -Include. Aquí está esa solución:
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:
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.
fuente
En * nix, esto también encontrará
--bare
repositorios.fuente
name.git
eso es solo una convención, que yo, por ejemplo, no sigo.find
esos repositorios?Repositorios Git todos tienen
HEAD
,refs
yobjects
las entradas.en GNU / cualquier cosa,
Con solo buscar,
.git
se 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,
(editar: pensé que el
.git/config
archivo era necesario, resulta que no lo es, por lo que el mínimo absolutogit init newrepo
es)
fuente
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
fuente
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 defind
es/
: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):Explicación rápida de los primarios de
find
usado (dado que aquí no hay operadores presentes,-and
está implícita, es decir, para cada nodo visitado los primarios se evalúan de izquierda a derecha hasta que uno de ellos evalúafalse
):-name
estrue
si el nombre coincide (a menudo, pero no aquí, con comodines)-exec
ejecuta un comando terminado por;
(del cual se escapa\
para evitar la interpretación del shell), y estrue
si el estado de retorno es0
( es decir, OK). El nodo actual está disponible como{}
(que no necesita escapar)-prune
es siempretrue
, y hace que se omitan todos los nodos secundarios-type d
estrue
para directorios-print
es necesario aquí porque si-exec
está presente no se adjunta implícitamentefuente
En Linux, pruebe este comando con permiso de root:
esto solo busca todos los archivos que terminan con .git ... puede hacerlo con herramientas de búsqueda en Windows, Linux, etc.
fuente
find
salir todo y luego filtrar congrep
. Preferiría usar--name "*.git"
/
á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.Una versión simple de PowerShell:
fuente
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
Para Linux:
fuente
Pequeña variación de la respuesta de Eric Burcham. Esa respuesta agrega \ .git al final, esta no.
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 {}.
fuente