我有以下项目结构:
root-project
|
|-- A
| |
| |-- C
|
|-- B
A和B是根项目的子模块。 C又是一个子模块 项目A.假设我对项目A,B和C进行了更改 将这些变化归于各自的指数。之后我更新了 根项目中对A和B的引用并提交更改 同样。当我使用选项推送根项目的更改时 --recurse-submodules = on-demand,git推送项目A的所有提交, B和root项目,但默默地忽略了提交 项目C.我希望它也能推动项目C的变化。
我知道我可以通过在root-project文件夹中使用以下两个命令解决此问题。
git submodule foreach --recursive 'git push origin master'
git push
有人可以澄清我是否做错了或者这是git-push中的错误。我已经在git邮件列表上提出了这个问题,但没有收到任何回复:{{3 }}
我还编写了一个小shell脚本,用于设置描述的项目结构并执行递归推送操作: http://thread.gmane.org/gmane.comp.version-control.git/266184
git version 2.3.3
答案 0 :(得分:1)
git push --recurse-submodules=on-demand
将真正递归,但有一定条件。
commit c7be720见Brandon Williams (mbrandonw
)(2017年7月20日)
(由Junio C Hamano -- gitster
--合并于commit a49794d,2017年8月22日)
submodule - helper:教push-check来处理HEAD
在06bf4ad(
push
:传播远程和refspec --recurse-submodules,git 2.13.0)推荐了如何将&ref;--recurse-submodules
'国旗给出了。唯一允许传播的refspec是指在超级项目和子模块中存在的ref的名称,但需要注意的是' HEAD'被禁止了。
这个补丁教授推送检查(子模块助手确定是否 refspec可以传播到子模块)以允许传播'
HEAD
' 当且仅当:
- 超级项目和子模块都有相同的 命名分支签出和
- 子模块未处于分离头状态。
答案 1 :(得分:0)
我的own answer的副本
如果您的子模块包含子模块,则命令 git push --recurse-submodules=on-demand
不起作用。 (git
版本:2.20.1)
在您的 ~/.gitconfig
文件中添加以下别名:
[alias]
push-all = "! find . -depth -name .git -exec dirname {} \\; 2> /dev/null | sort -n -r | xargs -I{} bash -c \"cd {}; git status | grep ahead > /dev/null && { echo '* Pushing: {}'; git push; }\""
然后在您的父 git 文件夹中发出 git push-all
。
!
:我们正在发出一个非 git 命令。find . -depth -name .git -exec dirname {} \\; 2> /dev/null
:查找所有子模块(和 git 存储库,不会造成危害)| sort -n -r
:按路径深度排序,最深的在前。| xargs -I{} bash -c \"
:将目录传递给以下命令:
cd {};
:cd
到目标目录。git status | grep ahead > /dev/null
:测试是否有必要推送此存储库。&& { echo '* Pushing: {}'; git push; }\""
:通知和推送。