2013-05-07 24 views
2

我有一个存储库A,具有库B作为子模块。 在一个理想的世界中,这是不可能发生的,但让我们说,由于某种原因,我希望做一个互动的底垫在仓库B.衍合的子模块

如果我这样做,并推动新的提交到远程(使用git push origin master --force ),下一次我会克隆存储库中,并拨打:

git submodule update --init 

此命令就会失败,因为B的历史被改写,和git将无法找到指定的提交最初添加的子模块乙给A带。

我该怎么办?

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

谢谢!

回答

2

从你说的话,你强制更新回购B,但不更新回购A中的参考。所以你必须做的是更新它。

转到回购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

+0

完美工作。谢谢! – 2013-05-08 08:23:54

+0

对于回购A中的旧承诺呢?他们会不会参考rebase之前制作的回购B的提交? – bcause 2016-12-14 01:59:19

0

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

是什么原因做力推?

+0

我要做一个力推因为B的历史被重写了,所以远程将不允许推动。我的问题是,当我将子模块添加到A时,git存储当前最新的提交sha1,因此下次我执行'$ git submodule update'时,它可以检出该提交。但是,由于B中不存在提交的rebase,所以git无法克隆/更新子模块。 – 2013-05-07 20:09:09