Ответ 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
У меня есть куча (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
Команда 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
Что-то в этом роде?
$ 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
Я не думаю, что git имеет эту сборку, поэтому я (также) создал script для этого: https://github.com/mnagel/clustergit
Проблема с опубликованными здесь фрагментами заключается в том, что они прерываются по мере изменения формата вывода git status
. Мой script имеет ту же проблему (поскольку он в основном работает одинаково), но по крайней мере вы всегда получаете последнюю версию.
Вы можете использовать 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
).
for rp in /srv/*/
do
printf '\ec'
cd "$rp"
git status
echo "${rp%/}"
read
done
Это не очень нравится для форматирования, но как насчет чего-то вроде
find . -iname ".git" -type d | sed -rne "s|(.+)/\.git|echo \1;cd \1;git status;cd /data|p" | bash
Я думаю, что это выполнит работу для каждого репо
git status -uall