Что делает hg copy? - PullRequest
       44

Что делает hg copy?

12 голосов
/ 16 декабря 2011

Недавно мы сделали hg copy каталога в нашем хранилище.Мы думали, что он делает что-то вроде cp -a и hg add и, возможно, каким-то образом помечает, что этот файл был скопирован из другого файла внутри репозитория (поэтому hg annotate показывает оригинальный коммиттер).Но теперь кажется, что hg copy делает больше или иное, чем это.Я не мог найти много о том, как именно работает копирование.Итак:

  • Что именно делает hg copy и какую особую обработку это вызывает в будущем?
  • Если оказывается, что "неправильная вещь (тм)" дляв нашем случае, как мне пометить файл как копию другого файла?

(Этот вопрос был задан в списке рассылки Mercurial, возможно, вы захотите следовать исходной теме тоже.)

Ответы [ 2 ]

15 голосов
/ 16 декабря 2011
  • Что именно делает 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.

0 голосов
/ 26 мая 2019

Как мне пометить файл как копию другого файла?

Если вы вернете копию hg, скопированный файл останется в вашем рабочем каталоге и не будет отслежен.Вы просто должны добавить это нормально.На скопированный файл это никак не влияет.

% hg copy file new-file
% hg status -C
A new-file
__file
% hg revert new-file
% hg add new-file
% hg status -C
A new-file

Ссылка: Mercurial: полное руководство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...