我有一个包含其他git仓库的git仓库。是否存在可以递归地推送和/或拉取元仓库和子仓库的命令?
每当我想要更新我的llvm/clang代码库时,我发现自己处于相同的情况,有了一点bash帮助,我可以像这样“git pull”它们:
$> for dir in $(find . -name ".git"); do cd ${dir%/*}; git pull ; cd -; done
这将“git pull”当前目录下找到的所有git代码库,并且如果它们是裸仓库,则可能无法正常工作。
不完全是git pull
,但很接近:
git fetch --recurse-submodules
来自Git文档:
--recurse-submodules[=yes|on-demand|no]
此选项控制何时以及在什么条件下也要获取已填充子模块的新提交。它可以用作布尔选项,当设置为否时完全禁用递归,或者当设置为是时无条件地递归到所有填充的子模块中,这是使用此选项而没有任何值时的默认值。使用按需选项只有在超级项目检索更新了子模块引用到尚未在本地子模块克隆中的提交时,才会递归到填充的子模块中。
如果您提到子模块,请参考杯子蛋糕的回答。
如果您在谈论包含git仓库的文件夹层次结构,可以尝试使用我编写的工具clustergit
进行检出:https://github.com/mnagel/clustergit
git status
。如果状态干净并且指定了-p
,它将执行git pull
,只有在设置了远程时才会成功,否则会出现警告(但是clustergit将继续处理其他存储库)。 - mnagelpush
到origin master
,递归地从origin master
pull
更改,给出显示打开和关闭-v
的示例。此外,在每个目录中是否有一种方法可以进行add
或commit
? - David Y. Stephenson我刚刚编写了一个脚本,可以递归地在多个git仓库上执行。您可以从这里获取:
这个想法与clustergit相同,但实现方式不同。在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