Mercurial: как объединить изменения в файл, который переименован в другой ветке? - PullRequest
6 голосов
/ 27 октября 2010

У меня есть хранилище Mercurial с четырьмя ветками в нем. Одна - «общая» ветвь, остальные три - «специфические» ветви, которые состоят из косметических изменений, примененных к общей ветви. Одно из этих косметических изменений состояло в переименовании некоторых файлов.

Таким образом, общая ветвь имеет «file.txt», а первая определенная ветвь имеет «file-01.txt», который является тем же файлом, используемым для той же цели , но имеет другое имя и немного другое содержание. Он был переименован в file-01.txt в определенной ветви, и «hg log -f file-01.txt» правильно показывает историю, возвращающуюся до переименования.

Когда я делаю изменение в file.txt в общей ветке, мне нужно иметь возможность объединить это изменение в file-01.txt в конкретной ветке. Но Mercurial не понимает, что файлы одинаковы. Это говорит мне:

удаленный измененный файл .txt, который локально удален

использовать (с) зависшую версию или оставить (д) выбор?

Если я выберу «c», то получу новый файл file.txt, содержащий именно то, что находится в версии общей ветки. Если я выберу «d», то изменение вообще не будет объединено.

Что я могу сделать, чтобы понять это правильно?


РЕДАКТИРОВАТЬ: я могу заставить его работать правильно в новом тестовом репозитории, но не в моем реальном репо. Вот что я получаю (обратите внимание, что версия 118 находится в конкретной ветке, непосредственно перед исходным переименованием, поэтому я снова прохожу процесс переименования для иллюстрации):

C: \ ...> hg update -C 118

0 файлов обновлено, 0 файлов объединено, 0 файлов удалено, 0 файлов не разрешено

C: \ ...> hg merge default

объединение file.txt
объединение anotherfile.txt
0 файлов обновлено, 2 файла объединено, 0 файлов удалено, 0 файлов не разрешено
(объединение веток, не забудьте зафиксировать)

Так что работает без переименования. Но если я переименую, произойдет сбой:

C: \ ...> hg update -C 118

2 файла обновлено, 0 файлов объединено, 0 файлов удалено, 0 файлов разрешено

C: \ ...> hg переименовать file.txt file-01.txt
C: \ ...> hg commit -m "переименован"

создал новую голову

C: \ ...> hg merge default

удаленный измененный файл .txt, который локально удален
использовать (в) зависшую версию или оставить (д) в избранном?


РЕДАКТИРОВАТЬ 2: Вот что я получаю на последнем шаге из hg merge --debug default:

поиск копий обратно на оборот 115
несопоставленные файлы в локальной сети:
Файл-01.txt
все найденные копии (* = объединить,! = расходящиеся):
file-01.txt -> file.txt

проверка переименования каталогов
разрешение манифестов
перезаписать Нет частичное Ложь
предок 9d979018c2df локальный f842fdbc252b + удаленный 05fc75e480da
anotherfile.txt: версии отличаются -> m
удаленно изменил файл .txt, который локально удалил
использовать (с) зависшую версию или оставить (д) выборным?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

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

0 голосов
/ 27 октября 2010

Проблема в том, как вы обрабатывали переименование в ветке. Судя по всему, вы (или ваш графический интерфейс) выполнили «удаление» старого имени file.txt, а затем добавили копию этого файла file-01.txt.

Когда вы делаете это таким образом, Mercurial не знает, что они связаны. Однако, если вы использовали в ветке команду:

hg rename file.txt file-01.txt

тогда к сообщению file-01.txt будет применено не то сообщение, которое вы видите, изменения файла file.txt. Однако без вашей помощи Mercurial не может знать, что они связаны.

...