Git子模块推

时间:2011-04-28 06:05:48

标签: git git-submodules

如果我修改子模块,我可以将提交推回到子模块源,还是需要克隆? 如果克隆,我可以将克隆存储在另一个存储库中吗?

2 个答案:

答案 0 :(得分:111)

子模块只不过是另一个repo中的git repo的克隆,带有一些额外的元数据(gitlink tree entry,.gitmodules文件)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

答案 1 :(得分:94)

请注意,由于git1.7.11([ANNOUNCE] Git 1.7.11.rc1release note,2012年6月)提及:

  

git push --recurse-submodules”学会了选择性地查看绑定到超级项目的子模块的历史并推出它们。

可能在this patch --on-demand 选项后​​完成:

recurse-submodules=<check|on-demand>::
  

确保要推送的修订使用的所有子模块提交都可在远程跟踪分支上使用。

     
      
  • 如果使用check,将检查所有要推送的修订中更改的子模块提交是否可用于遥控器。
      否则推送将被中止并以非零状态退出。
  •   
  • 如果使用on-demand,则将推送要推送的修订中更改的所有子模块。
      如果按需无法推送所有必要的修订,它也将被中止并以非零状态退出。
  •   

因此,您可以一次性推送所有内容(来自父级回购)a:

git push --recurse-submodules=on-demand

此选项仅适用于一个嵌套级别。不会推送对另一个子模块内部子模块的更改。


使用git 2.7(2016年1月),一个简单的git push就足以推送父repo ...并所有其子模块。

commit d34141c查看commit f5c7cd9commit f5c7cd9(2015年12月3日),commit b33a15b(2015年12月3日)和Mike Crowe (mikecrowe)(2015年11月17日)。
Junio C Hamano -- gitster --commit 5d35d72中合并,2015年12月21日)

  

push:添加recurseSubmodules配置选项

     

--recurse-submodules命令行参数已存在   时间,但没有相应的配置文件。

     

遵循git fetch的相应参数的样式,让我们来   发明push.recurseSubmodules以提供此参数的默认值   这还需要添加--recurse-submodules=no   允许在命令行上覆盖配置   必需的。

     

实现这一目标最直接的方法似乎是制作   push以与submodule-config类似的方式使用fetch中的代码。

git config doc now include

  

push.recurseSubmodules

     

确保要推送的修订使用的所有子模块提交都可在远程跟踪分支上使用。

     
      
  • 如果值为“check”,则Git将验证在子模块的至少一个远程位置上是否可以使用要推送的修订中更改的所有子模块提交。如果缺少任何提交,则推送将中止并以非零状态退出。
  •   
  • 如果值为“on-demand”,则将推送在要推送的修订版中更改的所有子模块。如果按需无法推送所有必要的修订,它也将被中止并退出非零状态。 -
  •   
  • 如果值为“no”,则会保留在推送时忽略子模块的默认行为。
  •   
     

您可以在推送时通过指定“--recurse-submodules=check|on-demand|no”覆盖此配置。

所以:

git config push.recurseSubmodules on-demand
git push

Git 2.12(2017年第1季度)

git push --dry-run --recurse-submodules=on-demand实际上会有效。

commit 0301c82commit 1aa7365Brandon Williams (mbrandonw)(2016年11月17日) Junio C Hamano -- gitster --在2016年12月16日commit 12cf113合并)

  当push配置为推送子模块时,

push run with --dry-run实际上并不是(Git 2.11 Dec. 2016和lower / before)执行干运行   点播。
  相反,所有需要推送的子模块实际上都被推送到他们的遥控器,而超级项目的任何更新都是以干运行的方式执行的。
  这是一个错误,而不是干跑的预期行为。

     

在配置为按需递归推送子模块时,教push尊重--dry-run选项。
  这是通过将--dry-run标志传递给子进程来完成的,该进程在执行干运行时执行子模块的推送。


现在仍然在Git 2.12中,你现在有一个“--recurse-submodules=only”选项来推送子模块,而无需推送顶级超级项目

commit 225e8bf点击commit 6c656c3commit 14c01bdBrandon Williams (mbrandonw)(2016年12月19日)。{ Junio C Hamano -- gitster --于2017年1月31日commit 792e22e合并)