2017-02-03 118 views
3

原始.gitmodules文件使用硬编码https网址,但对于我从ssh克隆的一些自动测试,并使子模块网址与../ModuleName相关。我不想将这些变化推回回购。如何在本地更改git子模块url?

# change the https://github.com/ with [email protected]: 
sed -i 's/https:\/\/github.com\//[email protected]:/g' ".git/config" 
# delete the url lines from the submodule blocks of .git/config 
sed -i '/submodule/ {$!N;d;}' ".git/config" 
# change hardcoded https:// urls of submodules to relative ones 
sed -i 's/https:\/\/github.com\/ProjName/../g' ".gitmodules" 
# also make the same change in the .git/modules/*/config 
sed -i 's/https:\/\/github.com\/ProjName/../g' .git/modules/*/config 
# sync and update 
git submodule sync 
git submodule update --init --recursive --remote 

上面的代码片断,它做我想要的。然而,令人讨厌的是,.git/modules/文件夹似乎不受版本控制,但如果我只是删除它,git submodule sync和大多数其他Git操作就停止工作。

有没有办法在修改.gitmodules.git/config文件后重新生成.git/modules

回答

7

如果您想修改仅用于本地回购的子模块的URL,则不要修改.gitmodules文件,该文件仅适用于您要推送的更改。

相反,先初始化本地子模块的配置:

git submodule init 

然后修改.git/config文件以更改子模块URL如常。 (同样,没有必要修改.gitmodules这里,如果这是一个新的克隆,你可能不会有.git/modules呢。)

作为@jthill points out,更简单的方法来修改子模块的网址是:

git config submodule.moduleName.url ssh://[email protected]/path 

在这一点上,你不要想运行git submodule sync,因为这将覆盖您刚才使用.gitmodules文件中的值所做的更改。相反,直接去:

git submodule update --recursive --remote 
+0

是的,这个回答我原来的问题,并非常感谢你。作为一个稍微不同的问题,有没有办法重新创建'.git/modules'文件夹?因为一旦创建它,​​如果我手动删除它,那么几乎所有的git命令都会从这一点开始感到不安。 –

+0

@abdus_salam可能的解决方案[here](// stackoverflow.com/a/36983168/2747593)。 –

0

我试过上述解决方案,但由于某种原因有一堆问题。以下是另一种选择。

在一个新的版本库:

  1. git submodule init
  2. 初始化每个子模块与git clone ../local/path/to/submodule.git path/in/repo/submodule

每当根库子模块的哈希值改变,你需要同步的子模块手动:

  1. 更新根存储库
  2. git submodule update有可能--force--recursive好措施