¿Hay alguna forma en la que pueda ver todos los repositorios de git que existen en mi máquina? ¿Algún comando para eso?
¿Hay alguna forma en la que pueda ver todos los repositorios de git que existen en mi máquina? ¿Algún comando para eso?
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.
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
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.
En * nix, esto también encontrará --bare
repositorios.
find / -name "*.git" -type d
name.git
eso es solo una convención, que yo, por ejemplo, no sigo.
find
esos repositorios?
Repositorios Git todos tienen HEAD
, refs
y objects
las entradas.
en GNU / cualquier cosa,
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
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,
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/config
archivo era necesario, resulta que no lo es, por lo que el mínimo absoluto git init newrepo
es
mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
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 find
es /
:
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 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úa false
):
-name
es true
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 es true
si el estado de retorno es 0
( es decir, OK). El nodo actual está disponible como {}
(que no necesita escapar)-prune
es siempre true
, y hace que se omitan todos los nodos secundarios-type d
es true
para directorios-print
es necesario aquí porque si -exec
está presente no se adjunta implícitamenteEn 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.
find
salir todo y luego filtrar con grep
. 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:
Get-ChildItem . -Recurse -Hidden .git
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:
dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo
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