2013-05-07 3 views
2

У меня есть репозиторий A, имеющий репозиторий B как подмодуль. В идеальном мире это никогда не случится, но скажу, что по какой-то причине, я хочу сделать интерактивный перебазироваться в хранилище B.Rebasing subodule

Если я так и раздвинуть новые коммиты на пульт дистанционного управления (с помощью git push origin master --force), в следующий раз я буду клонировать репозиторий а, и называют:

git submodule update --init 

эта команда потерпит неудачу, потому что история B была переписана, и мерзавец не сможет найти конкретную совершить подмодуль B первоначально был добавлен к A с.

Что я могу сделать?

Удалить подмодуль и добавить его еще раз? Есть ли лучшее решение?

Спасибо!

ответ

2

Из того, что вы сказали, вы принудительно обновляете репо B, но не обновляете ссылку в репо 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

Работал отлично. Спасибо! –

+0

Как насчет старших коммитов в репо A? Разве они не будут ссылаться на коммиты из репо B, которые были сделаны до перезагрузки? – bcause

0

Вы хотите обновить A/.gitmodules, чтобы отразить изменения в B. Теперь, в процессе форсирования силы B, если бы вы потеряли некоторые ссылки, обновление сломается.

Что является причиной для принудительного толчка?

+0

Я должен сделать усилие толчок потому что история Б была переписана, поэтому удаленный не позволит толкнуть. Моя проблема заключается в том, что когда я добавляю подмодуль в A, git сохраняет текущую последнюю команду sha1, поэтому в следующий раз, когда я буду обновлять подмодуль '$ git, он может проверить, что совершить. Однако из-за переадресации, что commit не будет существовать в B, поэтому git не может клонировать/обновлять подмодуль. –