2009-06-07 15 views
14

Tengo un montón (10-15) de repositorios Git locales en algún lugar de mi sistema de archivos, pero todos en la carpeta/data/git: Encuentra todos los Locales repos uncommited en un árbol de directorios

Quiero encontrar todos/cualquier carpeta que tenga cambios sin compromiso. ¿Cómo puedo hacer eso? Algo así como una variante recursiva global git status.

Creo que todas las respuestas funcionaron mal. Cualquier comando de git solo funciona dentro de la carpeta que está bajo el control de git. Necesito algo para buscar esas carpetas.

Así que en lugar de escribir este script que hace esto:


#!/usr/bin/env ruby 
require 'find' 
require 'fileutils' 

#supply directory to search in as argument 

@pat = ARGV[0] 
(puts "directory argument required"; exit) unless @pat 
Dir.chdir(@pat) 
Find.find(@pat) do |path| 
    if FileTest.directory?(path) 
    Dir.chdir(path) 
    resp = `git status 2>&1` 
    unless resp =~ /fatal|nothing to commit \(working directory clean\)/i 
     puts "#{'#'*10}\n#{Dir.pwd}#{'#'*10}\n#{resp}" 
     Find.prune 
    end 

    Dir.chdir(@pat) 
    end 
end 
 

Respuesta

6

algo en este sentido?

 
$ for i in /data/*/; do (cd $i && (echo $i; git status)); done 
$ for i in /data/*/; do (cd $i \ 
> && (git status | grep -qx 'nothing to commit (working directory clean)' \ 
> || (echo $i && git status))); done 
+0

No utilizar git-estado. Use git-ls-files y git-diff/git-diff-files en su lugar. –

+0

¿Qué pasa con git-status? – Bombe

+4

git-status se llama porcelana y es para el usuario, y no para el scripting. Su salida puede cambiar sin previo aviso. –

0

Puede utilizar "git ls-files --modified --deleted --exclude-estándar" para listar todos los archivos modificados y eliminados (--exclude-standard probablemente no es necesario, pero en caso de que desea listar todos los archivos desconocidos que no se ignoran con --other ...). Luego puede verificar si la salida de este comando está vacía.

O puede verificar el estado de salida de "git diff - HEAD HEAD" si desea verificar si "git commit -a" captará algo, o "git diff --cached --quiet HEAD" si desea verificar si "git commit" escogería algo (o uno de sus parientes de plomería: git-diff-files o git-diff-index).

0
for rp in /srv/*/ 
do 
    printf '\ec' 
    cd "$rp" 
    git status 
    echo "${rp%/}" 
    read 
done 

Example

4

no creo Git tiene esta estructura en, por lo que (también) se creó un script para hacer esto: https://github.com/mnagel/clustergit

El problema con los fragmentos publicados aquí es que se se rompe cuando cambia el formato de salida de git status. Mi script tiene el mismo problema (ya que básicamente funciona de la misma manera), pero al menos siempre obtienes la última versión. enter image description here

+0

me gusta este script! – ben

0

No es muy elegante para el formato, pero ¿qué tal algo así como

find . -iname ".git" -type d | sed -rne "s|(.+)/\.git|echo \1;cd \1;git status;cd /data|p" | bash 
10

El comando find es su amigo, junto con un poco de magia cáscara.

find . -type d -name '.git' | while read dir ; do sh -c "cd $dir/../ && echo -e \"\nGIT STATUS IN ${dir//\.git/}\" && git status -s" ; done 

de: https://gist.github.com/tafkey/664266c00387c98631b3

+2

Ayudaría si explicaras lo que está haciendo ese comando. –

Cuestiones relacionadas