2009-06-07 8 views
14

ich ein paar haben (10-15) von lokalen git Repositories irgendwo auf meinem Dateisystem, aber alle in den Ordner/data/git: Alle Uncommited Einheimischen repos in einem Verzeichnisbaum

Ich möchte alle finden/Alle Ordner, deren Änderungen aufgehoben wurden. Wie kann ich das machen? Wie eine rekursive globale git status Variante.

Alle Antworten haben es falsch, denke ich. Jeder Git-Befehl funktioniert nur innerhalb des Ordners, der sich unter git control befindet. Ich brauche etwas, um nach solchen Ordnern zu suchen.

Anstatt also schrieb ich dieses Skript, das dies tut:


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

Antwort

6

Etwas in dieser Richtung?

 
$ 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

nicht git-Status Verwenden Sie. Verwenden Sie stattdessen git-ls-Dateien und git-diff/git-diff-Dateien. –

+0

Was ist los mit Git-Status? – Bombe

+4

git-status ist so genannt Porzellan und es bedeutete für den Benutzer, und nicht für das Scripting. Die Ausgabe kann sich ohne vorherige Ankündigung ändern. –

0

Sie können „git ls-files --modified --deleted --exclude-Standard“ zur Liste alle geänderten und gelöschten Dateien (--exclude-standard ist nicht wahrscheinlich dort gebraucht, aber nur für den Fall, dass Sie alle unbekannten Dateien aufzulisten die nicht mit --other ignoriert werden ...). Sie können dann prüfen, ob die Ausgabe dieses Befehls leer ist.

Oder Sie können den Exit-Status von "git diff --quiet HEAD" überprüfen, wenn Sie überprüfen möchten, ob "git commit -a" etwas aufnehmen würde, oder "git diff --cached --quiet HEAD", wenn Sie möchte überprüfen, ob "git commit" irgendetwas auswählen würde (oder eines seiner Klempner Verwandte: git-diff-files oder git-diff-index).

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

Example

4

Ich glaube nicht, git hat dies in bauen, damit ich (auch) erstellt ein Skript, dies zu tun: https://github.com/mnagel/clustergit

Das Problem mit dem hier gepostet Schnipsel ist, dass sie brechen, wenn sich das Ausgabeformat von git status ändert. Mein Skript hat das gleiche Problem (da es grundsätzlich genauso funktioniert), aber zumindest bekommt man immer die neueste Version. enter image description here

+0

Ich mag dieses Skript! – ben

0

Es ist nicht sehr extravagant für die Formatierung aber wie wäre es so etwas wie

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

Der find Befehl ist dein Freund, zusammen mit einigen Shell-Magie.

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

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

+2

Es würde helfen, wenn Sie erklären würden, was dieser Befehl macht. –

Verwandte Themen