- Что именно делает hg copy и какая специальная обработка это делает
причина в будущем?
Добавляет новые файлы и помечает их как копии старых файлов. Поскольку они являются копиями, изменения, внесенные в исходный файл, будут объединены в копию. Время течет слева направо:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
- Если выясняется, что в нашем случае «что-то не так», как мне
разблокировать файл как копию другого файла?
Этот механизм срабатывает только при слиянии. Если b.txt
отсутствует в
ревизия общего предка (init на приведенном выше графике), затем Mercurial
выполните поиск в обратном направлении, чтобы увидеть, скопировано ли b.txt
откуда-то еще.
Продолжим приведенный выше график в сокращенном виде:
(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge)
\ / /
(copy a b) --/------- (edit b) ------------------/
Вопрос в том, как завершить слияние. Точка общего предка
теперь это узел copy a b
, и здесь присутствуют и a
, и b
. Это означает
что не будет никакого поиска копий! Так что второе редактирование a
не будет
быть объединенным в b
.
Чтобы перепроверить, я попробовал:
$ hg init
$ echo a > a
$ hg add a
$ hg commit -m init
$ hg copy a b
$ hg commit -m "copy a b"
Это была копия, b
теперь содержит только a
.
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo aa >> a
$ hg commit -m "edit a"
created a new head
$ hg merge
merging a and b to b
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "a edit copied to b"
Это было первое слияние, и редактирование a
было скопировано в b
:
$ cat b
a
aa
Теперь мы вносим изменения параллельно:
$ echo aaa >> a
$ hg commit -m "edit a again"
$ hg update 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo bbb >> b
$ hg commit -m "edit b"
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
Копирование не выполняется:
$ cat a
a
aa
aaa
$ cat b
a
aa
bbb
Что касается отключения этого ... вы не можете явно отключить копию
обнаружение. Но, как я надеюсь проиллюстрировать выше, это не будет вас беспокоить
снова после первого слияния.
Если при первом слиянии возникли проблемы, вы можете использовать hg resolve --tool
internal:local
для восстановления файлов до их состояния перед
началось слияние. Так с
$ hg resolve --tool internal:local b
мы могли бы вернуть b
к одной строке с a
.