Преобразование Mercurial с --filemap завершается неудачно с любым фиктивным переименованием

Я пытаюсь очистить хранилище с помощью hg convert --filemap, Преобразование прекрасно работает с любым параметром в файловой карте, кроме rename, Если я добавлю какие-либо rename опция для файловой карты, то это не удается при первом слиянии с abort: unable to convert merge commit since target parents do not merge cleanly,

Я пытался положить в файл карты только пустышку rename foo bar вариант (ни один из путей foo или bar на самом деле не существует в репо), и я получаю тот же результат.

Я попытался поставить реальное переименование (существующий 1-й путь), то же самое происходит. Как только любое переименование попадает туда, оно ломается.

Это ошибка? Что я делаю неправильно?

ОБНОВЛЕНИЕ: Воспроизвести:

Создать файл a, напишите что-нибудь в этом, передайте. Обновите до родителя, напишите что-нибудь еще в a, совершать. Слиться с другой головой, исправить конфликт вручную. Бегать hg convert с участием rename foo bar, Это не удастся, если коммит не может быть автоматически объединен.

2 ответа

Невозможно воспроизвести ошибку с файловой картой, определенной согласно правилам расширения вики:

Оригинальное репо

Repo>hg log --style changelog
2019-08-17  Me

        * file1.dat, file1.txt:
        Merge all from Data1
        [21caf63b7011] [tip] <Data2>

        * file1.dat:
        Compability fix
        [77667c9ad22c] <Data2>

        * file1.dat, file1.txt:
        Mod for Data2
        [7253bf25d7e7] <Data2>

        * file1.dat, file1.txt:
        Mod for Data1
        [de1f80454b7b] <Data1>

        * file1.dat, file1.txt:
        Mod1
        [7f1dd9e27ceb]

        * file1.dat, file1.txt:
        Initial tree
        [d10d46c86e0f]

Конвертированный репо

Conv>hg log --style changelog
2019-08-17  Me

        * core.code, data.dat:
        Merge all from Data1
        [350d1675a713] [tip] <Data2>

        * data.dat:
        Compability fix
        [7b13e52e0887] <Data2>

        * core.code, data.dat:
        Mod for Data2
        [05f2eae8379c] <Data2>

        * core.code, data.dat:
        Mod for Data1
        [6776b7ac4388] <Data1>

        * core.code, data.dat:
        Mod1
        [c733197f909c]

        * core.code, data.dat:
        Initial tree
        [19230ad05c7a]

Filemap

rename "file1.txt" "core.code"
rename "file1.dat" "data.dat"

I had the same error and I worked around it by splitting my conversion into multiple steps.

It seems like the problem is when you have a combination of renames in the filemap AND merges in the included history during a single run of convert. So I did this:

  1. Step 1: run using a filemap with NO RENAMES. Basically just to include/exclude things from the original repository into a temporary intermediate repo.

  2. Step 2: run hg convert again using a filemap that did only renames. This would go from the intermediate to final repositories. Even though merges were still in the history, no problems.

  3. Delete the intermediate repository

This got around the "abort" problem. Also a secondary benefit was that since step 1 was the longest (it was picking only a few 100 changesets out of about 20000) it became much easier to iterate on the renames. I find that filemaps are a little hard to get right since things will just fail silently.

I was using "Mercurial Distributed SCM (version 5.7)"

Другие вопросы по тегам