关于bash:在多个存储库上运行git gc

Run git gc on multiple repositories

本问题已经有最佳答案,请猛点这里访问。

我在/git有一个git库根

路径的深度不同,例如:

1
2
3
4
5
/git/project/project1/module1.git
/git/project/project1/module2.git
/git/project/project2/dev/module1.git
/git/library/libgit2.git
/git/library/jquery/jquery.git

如何在/git内的所有repos中递归运行git gc

我更喜欢使用shell脚本在存储库中迭代:如果该目录不是有效的git存储库,则不要运行git gc


您可以尝试如下操作:

1
find /git -name '*.git' -execdir sh -c 'cd {} && git gc' \;

这将找到与/git下的*.gitcd匹配的每个目录,并运行git gc


在某些系统(如osx)上,for循环将空格视为分隔符,中断包含空格的目录名。将IFS设置为仅使用换行符
使其正常工作,完成后重置为默认值:

1
2
oldIFS=$IFS; IFS=$'
'
; for line in $(find /git -name '*.git'); do (echo $line; cd $line; git gc); done; IFS=$oldIFS


由于msysgit的find版本(4.1)太旧,不支持-execdir选项。

我们必须编写一个for循环。

1
for line in $(find /git -name '*.git'); do (cd $line && git gc); done