2009-06-07 4 views
14

J'ai un tas (10-15) des dépôts git locaux quelque part sur mon système de fichiers, mais dans le dossier/data/git: Trouver toutes les prises en pension UNCOMMITED gens du coin dans une arborescence

Je veux trouver tous/n'importe quel dossier qui a des modifications non validées. Comment puis je faire ça? Un peu comme une variante récursive globale git status.

Toutes les réponses se sont trompées je pense. Toute commande git ne fonctionne que dans le dossier contrôlé par git. J'ai besoin de quelque chose pour rechercher de tels dossiers.

I Ainsi, au lieu écrit ce script qui fait cela:


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

Répondre

6

Quelque chose le long de ces lignes?

 
$ 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

Ne pas utiliser d'état git. Utilisez plutôt git-ls-files et git-diff/git-diff-files. –

+0

Quel est le problème avec git-status? – Bombe

+4

git-status est ce qu'on appelle la porcelaine et il signifie pour l'utilisateur, et non pour les scripts. Sa sortie peut changer sans préavis. –

0

Vous pouvez utiliser « git ls-files --modified --deleted exclude standard » pour lister tous les fichiers modifiés et supprimés (--exclude-standard est probablement pas nécessaire là, mais juste au cas où vous voulez lister tous les fichiers inconnus qui ne sont pas ignorés avec --other ...). Vous pouvez ensuite vérifier si la sortie de cette commande est vide.

Ou vous pouvez vérifier l'état de sortie de "git diff --quiet HEAD" si vous voulez vérifier si "git commit -a" ramasserait quelque chose, ou "git diff --cached --quiet HEAD" si vous vouloir vérifier si "git commit" choisirait n'importe quoi (ou l'un de ses parents de plomberie: git-diff-files ou git-diff-index).

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

Example

4

Je ne pense pas que ce connard a construit en, donc je (aussi) a créé un script pour le faire: https://github.com/mnagel/clustergit

Le problème avec les extraits publiés ici est qu'ils pause que le format de sortie de git status change. Mon script a le même problème (car il fonctionne essentiellement de la même manière), mais au moins vous obtenez toujours la dernière version. enter image description here

+0

J'aime ce script! – ben

0

Ce n'est pas très chic pour le formatage, mais que diriez-vous quelque chose comme

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

La commande find est votre ami, ainsi que la magie de la coquille.

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

Cela aiderait si vous expliquiez ce que cette commande est en train de faire. –