2009-06-07 13 views
14

Ho un sacco (10-15) del repository git locale da qualche parte sul mio filesystem, ma tutti nella cartella/data/git: Trova tutti i locali pronti contro termine uncommited in un albero di directory

Voglio trovare tutti i/qualsiasi cartella che ha modifiche non salvate. Come lo posso fare? Un po 'come una variante globale ricorsiva git status.

Tutte le risposte hanno sbagliato penso. Qualsiasi comando git funziona solo all'interno della cartella sotto controllo git. Ho bisogno di qualcosa per cercare tali cartelle.

Così, invece ho scritto questo script che fa questo:


#!/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 
 

risposta

6

Qualcosa in questo senso?

 
$ 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

Non utilizzare git-stato. Utilizza invece git-ls-file e git-diff/git-diff-files. –

+0

Cosa c'è di sbagliato in git-status? – Bombe

+4

git-status è così chiamato porcellana e significava per l'utente, e non per lo scripting. La sua produzione può cambiare senza preavviso. –

0

È possibile utilizzare "git ls-files --modified --deleted --exclude-standard" per elencare tutti i file modificati e cancellate (--exclude-standard non è probabilmente necessario lì, ma solo nel caso in cui si desidera elencare tutti i file sconosciuti che non sono ignorati con --other ...). È quindi possibile verificare se l'output di questo comando è vuoto.

Oppure è possibile controllare lo stato di uscita di "git diff --quiet HEAD" se si desidera verificare se "git commit -a" prenda nulla, o "git diff --cached --quiet HEAD" se si vuoi controllare se "git commit" sceglierà qualcosa (o uno dei suoi parenti idraulici: 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

Non credo git ha questo costruito in, quindi I (anche) ha creato uno script per fare questo: https://github.com/mnagel/clustergit

Il problema con i frammenti pubblicati qui è che essi interruzione come formato di output delle modifiche git status. Il mio script ha lo stesso problema (visto che funziona praticamente allo stesso modo), ma almeno si ottiene sempre l'ultima versione. enter image description here

+0

mi piace questo script! – ben

0

Non è molto di fantasia per la formattazione, ma come a qualcosa di simile

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

Il comando find è tuo amico, insieme a qualche magia guscio.

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

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

+2

Sarebbe d'aiuto se spiegassi cosa sta facendo quel comando. –

Problemi correlati