git:在目录树中查找所有未提交的本地存储库

时间:2009-06-07 02:57:53

标签: git scripting file

我的文件系统上有一堆(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

9 个答案:

答案 0 :(得分:15)

find命令是你的朋友,还有一些shell魔法。

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

答案 1 :(得分:6)

这些方面的东西?

$ 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

答案 2 :(得分:4)

我不认为git有这个内置,因此我(也)创建了一个脚本来执行此操作:https://github.com/mnagel/clustergit

此处发布的代码段问题是,它们会因git status的输出格式发生变化而中断。我的脚本有同样的问题(因为它基本上以相同的方式工作),但至少你总是得到最新的版本。 enter image description here

答案 3 :(得分:1)

还有一个名为multi-git-status的shell脚本可以执行此操作。

只需使用'%test%' <- function(lhs, rhs) { target <- sub("^(.*?)(\\$.*)","\\1",deparse(substitute(lhs))) elt <- sub("^(.*?\\$)(.*)","\\2",deparse(substitute(lhs))) val <- substitute(rhs) envir <- parent.frame() val.eval <- eval(val, envir = envir) target.eval <- eval(lhs, envir = envir) target.eval[[elt]] <- val.eval assign(target, target.eval, envir = envir) } test.list <- list(val = NULL) test.list$val %test% head(mtcars) # $val # mpg cyl disp hp drat wt qsec vs am gear carb # Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 # Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 # Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 # Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 # Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 # Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 命令(带有可选的目录名称参数):

答案 4 :(得分:0)

您可以使用“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-filesgit-diff-index)。

答案 5 :(得分:0)

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

Example

答案 6 :(得分:0)

格式化并不是很花哨但是像

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

答案 7 :(得分:0)

我认为这将为每个仓库做好工作

git status -uall

https://git-scm.com/docs/git-status

答案 8 :(得分:0)

仅使用查找

真的不需要花哨的 bash tomfoolery,只需使用 find。

find . -type d -name .git -print -execdir git status \;
  • find . -type d -name .git 递归查找所有 .git 存储库
  • -print 打印 .git 目录的路径
  • -execdir git status \; 在该目录(包含 git 目录的目录)中运行 git status