2009-06-07 9 views
14

mam kilka (10-15) lokalnych repozytoriów git gdzieś na moim systemie plików, ale wszystko w folderze/data/git: Znajdź wszystkie uncommited locals repo w drzewie katalogów

chcę znaleźć wszystkie/dowolny folder, który zawiera niezmienione zmiany. Jak mogę to zrobić? Coś w rodzaju rekurencyjnego globalnego wariantu git status.

Wszystkie odpowiedzi są złe, myślę. Każde polecenie git działa tylko w folderze, który jest pod kontrolą git. Potrzebuję czegoś do wyszukania takich folderów.

Zamiast więc napisałem ten skrypt, który wykonuje to:


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

Odpowiedz

6

Coś wzdłuż tych linii?

 
$ 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

nie wolno używać git-status. Zamiast tego użyj plików git-ls i git-diff/git-diff. –

+0

Co jest nie tak ze statusem git? – Bombe

+4

git-status to tak zwana porcelana, która przeznaczona jest dla użytkownika, a nie dla skryptów. Jego wydajność może ulec zmianie bez powiadomienia. –

0

Można użyć „git ls-files --modified --deleted --exclude-standard” do listy wszystkich zmodyfikowanych i usuniętych plików (--exclude-standard prawdopodobnie nie jest potrzebna tam, ale tylko w przypadku, gdy chcesz wymienić wszystkich nieznanych plików które nie są ignorowane przez --other ...). Następnie możesz sprawdzić, czy dane wyjściowe tego polecenia są puste.

Lub możesz sprawdzić status wyjścia "git diff --quiet HEAD", jeśli chcesz sprawdzić, czy "git commit -a" odbierze wszystko, lub "git diff --cached --quiet HEAD", jeśli chcesz sprawdzić, czy "git commit" wybierze cokolwiek (lub jednego z jego krewnych: git-diff-files lub git-diff-index).

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

Example

4

Nie sądzę git ma zbudować w tym, co ja (również) stworzył skrypt, aby to zrobić: https://github.com/mnagel/clustergit

Problem z fragmentów opublikowanych tutaj jest to, że przerwać jako format wyjściowy zmian git status. Mój skrypt ma ten sam problem (ponieważ w zasadzie działa w ten sam sposób), ale przynajmniej zawsze dostajesz najnowszą wersję. enter image description here

+0

Podoba mi się ten skrypt! – ben

0

To nie jest bardzo fantazyjne do formatowania, ale jak o czymś

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

Komenda find jest twoim przyjacielem, wraz z niektórych muszli magii.

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

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

+2

Byłoby pomocne, gdybyś wyjaśnił, co robi to polecenie. –