递归的Git推送/拉取?

26

我有一个包含其他git仓库的git仓库。是否存在可以递归地推送和/或拉取元仓库和子仓库的命令?


可能是Git - easy way pull latest of all submodules的重复问题。 - user456814
6个回答

13

每当我想要更新我的llvm/clang代码库时,我发现自己处于相同的情况,有了一点bash帮助,我可以像这样“git pull”它们:

$> for dir in $(find . -name ".git"); do cd ${dir%/*}; git pull ; cd -; done

这将“git pull”当前目录下找到的所有git代码库,并且如果它们是裸仓库,则可能无法正常工作。


如果目录名称中包含空格,则此方法无法正常工作。 - Hameer Abbasi

10

不完全是git pull,但很接近:

git fetch --recurse-submodules

来自Git文档

--recurse-submodules[=yes|on-demand|no]

此选项控制何时以及在什么条件下也要获取已填充子模块的新提交。它可以用作布尔选项,当设置为否时完全禁用递归,或者当设置为是时无条件地递归到所有填充的子模块中,这是使用此选项而没有任何值时的默认值。使用按需选项只有在超级项目检索更新了子模块引用到尚未在本地子模块克隆中的提交时,才会递归到填充的子模块中。


我并不是(故意地)指的子模块。我有一个包含其他仓库的仓库。这些仓库都是由我初始化的。我应该将它们转换成子模块吗? - David Y. Stephenson

9

如果您提到子模块,请参考杯子蛋糕的回答。

如果您在谈论包含git仓库的文件夹层次结构,可以尝试使用我编写的工具clustergit进行检出:https://github.com/mnagel/clustergit


@DavidY.Stephenson 是的,clustergit会递归扫描一个目录(默认为“.”)以查找“.git”目录,以确定git存储库的位置。然后在这些存储库上运行git status。如果状态干净并且指定了-p,它将执行git pull,只有在设置了远程时才会成功,否则会出现警告(但是clustergit将继续处理其他存储库)。 - mnagel
你能给我一个例子命令来递归地推送到 origin master 吗?我从文档中有些困难把它组合起来。 - David Y. Stephenson
太棒了。建议:递归地将更改pushorigin master,递归地从origin master pull更改,给出显示打开和关闭-v的示例。此外,在每个目录中是否有一种方法可以进行addcommit - David Y. Stephenson
@DavidY.Stephenson 我会更新文档。目前不支持添加/提交,因为所有当前操作都保证不需要用户交互。您如何解决这个问题?原则上,添加添加/提交不应该是一个问题。 - mnagel
如果你能够做到的话,这将会非常棒,可以递归地添加'.',即包含.git目录的目录,并且在每个仓库中递归地使用git命令并附上一条消息。 - David Y. Stephenson
显示剩余2条评论

1

我刚刚编写了一个脚本,可以递归地在多个git仓库上执行。您可以从这里获取:

https://github.com/DariuszOstolski/rgit

这个想法与clustergit相同,但实现方式不同。

0

0

在git 2.32上验证过,有一个命令可以允许递归拉取,如果你设置子模块跟踪分支。您可以通过将分支添加到.gitmodules文件来使子模块跟踪分支。 .gitmodules文件可以手动修改,或者您可以使用git submodule set-branch命令设置子模块分支:

git submodule set-branch --branch {BRANCH_NAME} -- {PATH_TO_SUBMODULE}

请将{PATH_TO_SUBMODULE}替换为您的子模块路径,将{SUBMODULE_BRANCH}替换为您想要子模块跟踪的分支。例如,如果我想要将我的子模块“usbLibrary”跟踪到“main”分支,我会执行以下操作:

git submodule set-branch --branch main -- usbLibrary

现在,在我工作于这个项目时,我可以通过以下方式确保usbLibrary子模块与main保持最新:

git submodule update --remote --recursive

我也想设置一个git别名,称之为git pull-subs

git config --global alias.pull-subs 'submodule update --remote --recursive'

现在,每当我需要更新所有内容时,我只需要:
git pull
git pull-subs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接