2010-01-07 21 views
81

¿Hay alguna manera de que pueda ver todos los repositorios git que existen en mi máquina? ¿Algún comando para eso?¿Cómo puedo ver todos los repositorios de git en mi máquina?

+0

Ver [git-summary] (https://github.com/MirkoLedda/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

Respuesta

69

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

+0

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 git usa para almacenar su metainformación. – cjstehno

+3

En Mac, el comando anterior también funciona. (¡A menos que esté ejecutando OS9 o anterior!) –

+0

¿Algún buen scripts de shell o pequeñas aplicaciones de utilidad que implementen esta sencilla función de búsqueda de archivos y agreguen 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 hacks no optimizados. – jmlane

9

En * nix, esto también encontrará cualquier repositorio --bare.

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

repositorios desnudos no necesitan ser nombrados 'nombre.git' eso es solo una convención, que yo, por ejemplo, no sigo. –

+2

Dado que los repositorios simples no necesitan seguir esa convención de nomenclatura, ¿existe una forma universal de 'encontrar' esos repositorios? – jmlane

3

En Linux, probar este comando con permisos de root:

find/| grep \\.git$ 

esto sólo searchs todos los archivos que terminan con .git ... puedes hacerlo con herramientas de búsqueda en Windows, Linux, etc. ..

+6

No tiene sentido dejar que 'find' genere todo y luego filtrar con' grep'. Prefiero usar '--name" * .git "' –

+2

@Gregory Pakosz: ¿Cuál es la diferencia? –

+9

@Michel, inicia 2 procesos y hace que el primero transmita a través de una tubería todo el árbol '/' durante el segundo a 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 los grandes sistemas de archivos podría marcar la diferencia. –

19

Esto funciona bastante bien desde Windows PowerShell:

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

¡muy útil para usuarios de Windows! :) –

+2

Get-ChildItem: no se puede encontrar un parámetro que coincida con el nombre del parámetro 'Atributos'. En línea: 1 char: 28 –

+0

@DewaldSwanepoel - No tengo idea de por qué vería ese error sobre el parámetro Atributos. Está claramente en la documentación, y lo he intentado ahora en varias combinaciones de versiones de Windows/PowerShell. Windows 7, 8 y 10 funcionan con varias versiones de PowerShell para mí. Si DESCUBRA por qué ocurre el error, compártelo aquí para que podamos aprender:>) –

1

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

locate -r "\.git$"

suponiendo que se mantiene de localizar la base de datos actualizada con sudo updatedb

+0

Definitivamente, locate es más rápido, úselo con precauciones, consulte aquí: https://unix.stackexchange.com/questions/60205/locate-vs-find-usage-pros-and-cons-of-eachother – AjayKumarBasuthkar

2

Git repositorios todos tienen HEAD, refs, objects y config entradas.

en GNU/nada,

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

Sólo la comprobación de .git se perderá muchos repos desnudos y todos los submódulos.

0

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

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

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

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

explicación rápida del primarias de find utilizado (ya que no operadores están presentes aquí, -and es implícita, es decir, para cada visitaron nodo primarias se evalúan de izquierda a derecha hasta que uno de ellos se evalúa como false):

  • -name es true si el nombre coincide con (a menudo, pero no aquí, con comodines)
  • -exec ejecuta un comando terminado por ; (que se escapó por \ para evitar la interpretación por parte de la concha) y es true si el estado de devolución es 0 (es decir, OK).El nodo actual está disponible como {} (que no necesita escape)
  • -prune es siempre true, y hace que todos los nodos hijos a ser omitidos
  • -type d es true para los directorios
  • -print que se necesita aquí porque si -exec está presente, no se adjunta implícitamente
Cuestiones relacionadas