重新定位子模块

时间:2013-05-07 16:56:08

标签: git git-submodules

我有一个存储库A,将存储库B作为子模块。 在一个理想的世界中,这应该永远不会发生,但是,比方说,出于某种原因,我想在存储库B中进行交互式变基。

如果我这样做,并将新提交推送到远程(使用git push origin master --force),下次我将克隆存储库A,并调用:

git submodule update --init

此命令将失败,因为B的历史记录被重写,并且git将无法找到子模块B最初添加到A的特定提交。

我该怎么办?

删除子模块并重新添加?有更好的解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

根据您的说法,您强制更新回购B,但不更新回购A中的引用。所以您需要做的就是更新它。

转到repo A中的根目录,然后您可以使用以下命令:

$cd /path/to/B
$git fetch   // fetch the newest commit of B
$git checkout origin/master

$cd /path/to/A
$git diff   // if all right, you will see some message like below

  --- a/submodule/B
  +++ b/submodule/B
  @@ -1 +1 @@
  -Subproject commit ac0569b524b9e47e86cb0a6c83e2e64c07fd878b
  +Subproject commit 84f9ac384242ded082feac5eeccfd608e2bab918

$ git add .
$ git commit -m 'message'
$ git push  // push the commit to A

在此之后,您可以克隆回购A并再次尝试git submodule update --init

答案 1 :(得分:0)

你想要更新A / .gitmodules以反映B中的变化。现在在B的强制推送过程中,如果你丢失了一些参考,更新将会中断。

强行推动是什么原因?