Подтвердить что ты не робот

Слияние после того, как каталог превратился в подмодуль

Я нахожу, что работая с подмодулями 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 правильной вещью с подмодулями против каталогов во время слияний, так что мне не нужно вручную отправлять процесс слияния, который только модифицирует файлы, не связанные с подмодулями?

4b9b3361

Ответ 1

Нет, вам не следует добавлять a, слияние не должно изменять его. Вы должны запустить

git reset a

Итак, вы игнорируете "chage" для a.

PS: видимо git просто проверяет существование каталога, поэтому, если вы

git submodule deinit a
rmdir a

до слияния, это сработает. Не уверен, что это то, что вы хотите.

Ответ 2

У меня возникла аналогичная проблема, когда я объединять код, содержащий папку, которая должна быть преобразована в подмодуль.

Я решил это, используя BFG --delete-folders, чтобы удалить папку из нового исходного кода и git gc, чтобы очистить репозиторий, тогда у меня будет git rebase без каких-либо конфликтов.