如何在所有提交中更新子模块URL

时间:2012-08-16 12:22:59

标签: git git-submodules

用例是我必须将某些存储库移动到新服务器。所以这些存储库得到了一个新的URL 引用这些子模块的父项目需要使用子模块的新URL进行更新 我想要做到以下几点。

  
      
  1. 更新.gitmodules文件
  2.   
  3. git submodule sync
  4.   
  5. git submodule update
  6.   
  7. 提交并推送
  8.   

但是,由于之前的提交具有.gitmodule的早期版本,如果我签出父项目的先前提交 - 它是否会查找旧服务器?


为了确保可重复性,我们需要让所有旧提交都能正常工作。 有想法解决这个问题吗?

2 个答案:

答案 0 :(得分:10)

.gitmodules中的网址通常仅在初始化子模块或git submodule sync时使用。在初始化(git submodule init)时,URL被放入存储库的.git/config,当子模块被克隆到位(在git submodule update上)时,要使用的URL来自配置。唯一一次使用.gitmodules中的URL的时候是运行git submodule sync,它同样会更新配置中的URL,但也会将子模块中的origin远程设置为相同URL。

这意味着在签出早期提交并运行git submodule update时不会有任何问题 - 当您在父级中签出新提交时,子模块中的远程origin不会更改库中。

答案 1 :(得分:0)

如果您需要这样做,唯一的方法是使用filter-branch

但是要小心,因为在所有提交中更改FlowDirection意味着您转换了提交。

如果您与很多开发人员分享了git repo,那么所有开发人员都需要强行拉动"基于旧提交的新提交和所有工作需要重新到新分支。

有很多关于重写git历史的讨论。