Слияние после того, как каталог превратился в подмодуль
Я нахожу, что работая с подмодулями git, я часто сталкиваюсь с проблемами слияния коммитов, которые содержат заданные подмодули, и те, которые представляют собой тот же код, что и обычный каталог. Пример небольшого воспроизведения:
# Create one project, to be used as a subproject later on
git init a
cd a
echo aaa > aa
git add -A
git commit -m a1
cd ..
# Create a second project, containing a as a normal directory initially
git init b
cd b
mkdir a b
echo aaa > a/aa
echo bbb > b/bb
git add -A
git commit -m b1
# Replace directory with submodule
git rm -r a
git submodule add ../a a
git commit -m b2
# Try to create branch from the pre-submodule state of affairs
git checkout -b branch HEAD^
Это уже дает ошибку:
error: The following untracked working tree files would be overwritten by checkout:
a/aa
Please move or remove them before you can switch branches.
Aborting
Чтобы избежать ошибки, я сначала деинициализую все подмодули:
# Create feature brach starting at version without submodule
git submodule deinit .
git checkout -b branch HEAD^
echo abc > b/bb
git commit -a -m b3
Как вы можете видеть, ветвь функции полностью не связана с подмодулем, изменяя другой набор файлов. Это делает эту проблему особенно раздражающей.
# Try to merge the feature branch
git checkout master
git merge branch
Это не удается, с сообщением об ошибке, которое я не совсем понимаю:
CONFLICT (file/directory): There is a directory with name a in branch. Adding a as a~HEAD
Automatic merge failed; fix conflicts and then commit the result.
Я получаю ту же ошибку, если я делаю git submodule update --init
до git merge branch
. Я не вижу нигде a~HEAD
ни в моем дереве каталогов, ни в выходе из git status
, который читается следующим образом:
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Changes to be committed:
modified: b/bb
Unmerged paths:
(use "git add <file>..." to mark resolution)
added by us: a
Если я сделаю git add a
, как было предложено, я получаю еще одну ошибку:
error: unable to index file a
fatal: updating files failed
Если я делаю git submodules update --init
непосредственно перед слиянием, я могу сделать git add a
успешно. Но если я забуду это сделать, а затем попробую сделать это после слияния, я получаю это сообщение об ошибке:
Submodule 'a' (…/a) registered for path 'a'
Skipping unmerged submodule a
Как мне оправиться от этой ситуации? Что-то другое, кроме git merge --abort
, так как я хотел бы использовать его для таких вещей, как git rebase
, а так как в некоторых сценариях (дон- я не умею воспроизводить). Я не мог даже полностью прекратить слияние, и вместо этого пришлось сделать жесткий reset.
Как я могу избежать этого в первую очередь? Есть ли какая-то волшебная настройка, которая делает git правильной вещью с подмодулями против каталогов во время слияний, так что мне не нужно вручную отправлять процесс слияния, который только модифицирует файлы, не связанные с подмодулями?
Ответы
Ответ 1
Нет, вам не следует добавлять a, слияние не должно изменять его. Вы должны запустить
git reset a
Итак, вы игнорируете "chage" для a.
PS: видимо git просто проверяет существование каталога, поэтому, если вы
git submodule deinit a
rmdir a
до слияния, это сработает. Не уверен, что это то, что вы хотите.
Ответ 2
У меня возникла аналогичная проблема, когда я объединять код, содержащий папку, которая должна быть преобразована в подмодуль.
Я решил это, используя BFG --delete-folders
, чтобы удалить папку из нового исходного кода и git gc
, чтобы очистить репозиторий, тогда у меня будет git rebase
без каких-либо конфликтов.