在多个存储库上运行git gc

时间:2012-08-08 01:56:48

标签: git bash

我在/git

有一个git存储库根目录

路径的深度不同,例如:

/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 gc内的所有回购邮件中递归运行/git

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

3 个答案:

答案 0 :(得分:32)

您可以尝试以下方式:

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

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

答案 1 :(得分:0)

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

我们必须写一个for循环。

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

答案 2 :(得分:0)

在某些系统(即OSX)上,for循环将空格视为分隔符,从而破坏包含空格的目录名称。将IFS设置为仅使用换行符\n才能正常工作,并在完成时重置为默认值:

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