16

我有一个 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在里面的所有 repos 中递归运行/git

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

4

3 回答 3

40

您可以尝试以下方法:

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

*.git这将在 下找到每个匹配的目录/gitcd进入它,然后运行git gc​​.

于 2012-08-08T02:32:41.853 回答
1

在某些系统(即 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
于 2013-03-29T15:28:02.063 回答
0

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

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

for line in $(find /git -name '*.git'); do (cd $line && git gc); done
于 2013-02-24T03:50:36.357 回答