我的文件系统上有一堆(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
答案 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
答案 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
的输出格式发生变化而中断。我的脚本有同样的问题(因为它基本上以相同的方式工作),但至少你总是得到最新的版本。
答案 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-files
或git-diff-index
)。
答案 5 :(得分:0)
for rp in /srv/*/
do
printf '\ec'
cd "$rp"
git status
echo "${rp%/}"
read
done
答案 6 :(得分:0)
格式化并不是很花哨但是像
这样的东西find . -iname ".git" -type d | sed -rne "s|(.+)/\.git|echo \1;cd \1;git status;cd /data|p" | bash
答案 7 :(得分:0)
答案 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