git: Найти все неподтвержденные локальные репозитории в дереве каталогов - PullRequest
19 голосов
/ 07 июня 2009

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

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

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

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

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

Ответы [ 8 ]

15 голосов
/ 28 сентября 2015

Команда 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

от: https://gist.github.com/tafkey/664266c00387c98631b3

6 голосов
/ 07 июня 2009

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

$ 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
4 голосов
/ 30 июня 2013

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

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

1 голос
/ 05 июня 2018

Существует также скрипт оболочки с именем multi-git-status, который делает это.

Просто используйте команду mgitstatus (с необязательным аргументом имени каталога):

0 голосов
/ 25 октября 2015

Я думаю, что это сделает работу для каждого репо

git status -uall

https://git -scm.com / документы / ГИТ-статус

0 голосов
/ 04 октября 2014

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

find . -iname ".git" -type d | sed -rne "s|(.+)/\.git|echo \1;cd \1;git status;cd /data|p" | bash
0 голосов
/ 29 февраля 2012
for rp in /srv/*/
do
  printf '\ec'
  cd "$rp"
  git status
  echo "${rp%/}"
  read
done

* Пример 1 003 *

0 голосов
/ 09 июня 2009

Вы можете использовать " git ls-files --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).

...