Поправка коммита с эффектами hg cp --after - PullRequest
2 голосов
/ 15 мая 2019

У меня есть файл before.txt, который я хочу разделить на два файла поменьше.То, что я должен был сделать, было

$ hg cp before.txt part1.txt # Then edit part1.txt
$ hg mv before.txt part2.txt # Then edit part2.txt
$ hg commit

Тогда и part1.txt, и part2.txt будут иметь before.txt как часть своей истории, поэтому diff будет отображаться как удаление частей.файла большего размера, вместо удаления одного файла и создания нового с некоторым его содержимым.

Однако, на самом деле я сделал

$ cp before.txt part1.txt # Then edit part1.txt
$ hg mv before.txt part2.txt # Then edit part2.txt
$ hg commit

Так что before.txt присутствует тольков истории одного из моих двух файлов.Если бы я не запустил hg commit, мне кажется, что я мог бы решить свою проблему с помощью

$ hg cp --after before.txt part1.txt

или чего-то подобного.И я не продвигал этот коммит вверх по течению, поэтому я должен иметь возможность редактировать его так, как мне нравится.Но я не могу понять, как это сделать.Когда я запускаю этот hg cp, я вижу:

$ hg cp --after before.txt part1.txt
before.txt: No such file or directory
before.txt: No such file or directory
abort: no files to copy

Это имеет смысл: он не может записать это редактирование как часть нового коммита, потому что исходный файл не существует.Я хочу записать его как часть предыдущего коммита, но я не знаю, как это сделать, кроме как записать его как часть нового коммита и затем amend вставить в предыдущий коммит.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Вот один из способов исправить эту ситуацию:

$ hg shelve       # get any miscellaneous, unrelated changes out of the way
$ hg up <parent of revision with the mistake in it>

$ hg cp before.txt part1.txt 
$ hg mv before.txt part2.txt 

$ hg revert -r <revision with the mistake in it> --all
$ hg commit
$ hg strip <revision with the mistake in it>

(на самом деле я не пробовал все эти команды, надеюсь, опечаток нет!)

ПервыйШаг не обязателен в зависимости от состояния ваших рабочих каталогов.

Теперь part1.txt и part2.txt должны иметь правильное содержимое.Использование revert было просто для того, чтобы избавить от необходимости вручную редактировать изменения файла.Но вы также можете просто переделать его вручную, если это кажется проще.

Использование revert для извлечения в рабочую папку эффект другой ревизии - это трюк, которым я часто пользуюсь.Это как ручной способ внесения изменений, который дает вам полную гибкость.Но это работает только тогда, когда ревизия, к которой вы вернули рабочую копию в , тесно связана с ревизией, которая является родительской для рабочей копии.В противном случае это приведет к многочисленным неприятным изменениям.

1 голос
/ 16 мая 2019

на основе ответа @DaveInCaz, вот MCVE

mkdir tmpdir
cd tmpdir
hg init

echo line1 > before.txt
echo line2 >> before.txt
hg add before.txt
hg commit -m "my before"

cp before.txt part1.txt
hg add part1.txt
hg mv before.txt part2.txt
echo line1 > part1.txt
echo line2 > part2.txt
hg commit -m "my bad"


hg shelve
hg up -r -2

hg cp before.txt part1.txt
hg cp before.txt part2.txt
hg revert -r -1 --all
hg commit -m "my good"

hg strip -r -2

некоторые замечания:

  • дважды hg cp, потому что позднее revert удалит файл before.txt для нас, в противном случае он будет жаловаться на отсутствие его
  • revert --all по крайней мере, в моей версии требуется указать, что возвращается
  • hg shelveдолжен быть в безопасности, прежде чем перейти на другую ревизию
  • hg up -r -2 может иметь -C, так как предыдущие shelve сделали нас безопасными, таким образом, вы можете повторить последние шаги с различными подходами и посмотреть, что подходиттебе лучше
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...