Git: найти все нерегулярные репозитории локалей в дереве каталогов

У меня есть куча (10-15) локальных репозиториев git где-то в моей файловой системе, но все в папке /data/

Я хочу найти все/любую папку с неустановленными изменениями. Как я могу это сделать? Как рекурсивный глобальный вариант git status.

Все ответы были ошибочными, я думаю. Любая команда git работает только в папке под элементом управления git. Мне нужно что-то искать в таких папках.

Поэтому вместо этого я написал этот script, который делает это:


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

Ответы

Ответ 1

Команда find - ваш друг, а также магия оболочки.

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

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

Ответ 2

Что-то в этом роде?

$ 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

Ответ 3

Я не думаю, что git имеет эту сборку, поэтому я (также) создал script для этого: https://github.com/mnagel/clustergit

Проблема с опубликованными здесь фрагментами заключается в том, что они прерываются по мере изменения формата вывода git status. Мой script имеет ту же проблему (поскольку он в основном работает одинаково), но по крайней мере вы всегда получаете последнюю версию. введите описание изображения здесь

Ответ 4

Вы можете использовать git ls файлы --modified --deleted --exclude-standard ", чтобы перечислить все измененные и удаленные файлы (--exclude-standard там, вероятно, не требуется, но на всякий случай вы хотите перечислить все неизвестные файлы, которые не игнорируются с --other...). Затем вы можете проверить, свободен ли выход этой команды.

Или вы можете проверить статус выхода " git diff --quiet HEAD", если вы хотите проверить, есть ли git commit -a "будет получать что угодно, или" git diff --cached --quiet HEAD ", если вы хотите проверить, будет ли" git commit "выбрать что угодно (или один из его родственников-сантехники: git-diff-files или git-diff-index).

Ответ 5

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

Пример

Ответ 6

Это не очень нравится для форматирования, но как насчет чего-то вроде

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