Mercurial: как удалить строку в файле для последних 4 наборов изменений (еще не нажатых)?

У меня есть локальный репозиторий mercurial с 5 фиксациями, которые все еще нужно отправить на сервер. Однако я случайно включил строку в два конкретных файла после последних 4 коммитов, которую я действительно не хочу иметь там (ни в одном из наборов изменений).

Есть ли какой-нибудь практический способ удалить эти строки в этих двух файлах? (кроме удаления моего локального репозитория, клонирования копии сервера и повторного применения всех изменений вручную)


person Rabarberski    schedule 12.07.2010    source источник


Ответы (2)


Вы получите множество различных предложений (mq, histedit, import/export), которые по сути делают одно и то же. И все они будут казаться очень неуклюжими, потому что mercurial построен на концепции неизменной истории — изменение истории должно быть трудным. Тем не менее, как вы правильно понимаете, если вы еще не нажали csets, это возможно. Вот процедура, которую я бы использовал — я предпочитаю ее, потому что она не требует включения расширений:

hg export --git -o ../all-five-csets.patch 0:tip
cd .. # exit the repo
vi all-five-csets.patch # delete the line manually each time it appears (probably only once)
hg init newrepo
cd newrepo
hg import ../all-five-csets.patch
cd ..
mv repo was-repo
mv newrepo repo

Все, что там происходит, это то, что вы экспортируете csets в текстовые представления самих себя. Создание нового пустого репо, а затем повторный импорт csets. Я сделал их все, потому что у тебя только пять. Если бы вы хотели изменить последние 5 из 500, я бы создал новый репозиторий, выполнив clone -r, который клонирует «до определенного момента», а затем применил csets, которые я оставил, в их отредактированной форме через импорт.

person Ry4an Brase    schedule 12.07.2010
comment
Хорошо объяснил! Один вопрос: строка действительно появляется один раз, но перед ней стоит «+», а перед старой (хорошей) строкой стоит «-», чтобы указать разницу. Я действительно удаляю строку «+» и оставляю строку «-» на месте. Или мне удалить строку «+» и «-»? (Конечно, в качестве альтернативы я мог бы просто изменить строку «+» на что-то, что меня не волнует) - person Rabarberski; 12.07.2010
comment
Выяснилось, что некоторые файлы растровых изображений (.ico), включенные в репозиторий, не были скопированы в файл исправления набора изменений (это казалось логичным, если оглянуться назад, поскольку это всего лишь текстовый файл). Но я не был уверен, могу ли я доверять ему все остальные мои файлы. Поэтому я обратился к клонированию репо из правильной версии в новое репо (используя hg clone -r 14 repo repo-new) и повторно применил изменения вручную. Тем не менее, ваше объяснение было очень ясным и помогло мне лучше понять mercurial. - person Rabarberski; 12.07.2010
comment
Звучит неплохо. Я думаю, что двоичные файлы (и права доступа к файлам) были бы включены, если бы я подумал добавить '--git' к экспорту, который я вставлю выше. У многих из нас есть [diff]\ngit=true в наших файлах ~/.hgrc, что делает это автоматически, и я забыл, что это не значение по умолчанию. - person Ry4an Brase; 12.07.2010
comment
и вы бы удалили - и строку +, тем самым отменив изменение. Просто чтобы быть еще более полным, если бы эта строка не была чем-то настолько ужасным, что она вообще не могла бы просочиться или вы уже нажали, обычным способом отменить это было бы 'hg backout -r badcset ; hg merge», который применяет набор изменений, обратный набору изменений. Оскорбительная линия остается в истории, но она ушла из «подсказки». - person Ry4an Brase; 12.07.2010

Если не важно, чтобы эти 5 коммитов были независимыми наборами изменений, вы используете hg свернуть, чтобы сверните их в один набор изменений, который не содержит тех строк, которые вы хотите избежать. т.е.

  • Удалите строки, которые вы не хотели включать, затем зафиксируйте это изменение.
  • Используйте hg collapse, чтобы свернуть последние 6 наборов изменений (существующие 5 локальных плюс ваш новый, который просто удаляет эти строки)

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

Предупреждение: будьте осторожны с использованием hg Collar — вы хотите убедиться, что не сворачиваете наборы изменений, которые уже были отправлены в другой репозиторий.

person Wilka    schedule 18.07.2010