Как отредактировать неверное сообщение о коммите в Mercurial?

В настоящее время я использую TortoiseHg (Mercurial) и случайно зафиксировал неверное сообщение о коммите. Как мне отредактировать это сообщение коммита в репозитории?

12 ответов

Решение

Обновление: Mercurial добавил --amend который должен быть предпочтительным вариантом сейчас.


Вы можете откатить последний коммит (но только последний) с помощью hg rollback и затем повторно примените это.

Важно: это навсегда удаляет последний коммит (или извлечение). Так что если вы сделали hg update эта фиксация больше не находится в вашей рабочей директории, тогда она исчезла навсегда. Поэтому сначала сделайте копию.

Кроме этого, вы не можете изменить историю репозитория (включая сообщения о коммитах), потому что там есть контрольное суммирование. Единственное, что вы можете сделать, это обрезать историю после заданного набора изменений, а затем воссоздать ее соответствующим образом.

Ничего из этого не будет работать, если вы уже опубликовали свои изменения (если вы не можете получить все копии), и вы также не можете "переписать историю", которая включает в себя коммиты, подписанные GPG (другими людьми).

Ну, я делал так:

Представьте себе, у вас есть 500 коммитов, и ваше сообщение о ошибочном коммите находится в п.498.

hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip

Хорошие новости: hg 2.2 только что добавил git like --amend вариант.

а в tortoiseHg вы можете использовать "Изменить текущую ревизию", выбрав черную стрелку справа от кнопки фиксации.

Я знаю, что это старый пост, и вы отметили вопрос как ответ. Недавно я искал то же самое и нашел histedit расширение очень полезно. Процесс объясняется здесь:

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

В TortoiseHg щелкните правой кнопкой мыши ревизию, которую вы хотите изменить. Выберите "Изменить историю" -> "Импорт MQ". Это преобразует все ревизии вплоть до выбранной ревизии из ревизий Mercurial включительно в патчи Mercurial Queue. Выберите патч, для которого вы хотите изменить сообщение, и он автоматически изменит экран на редактор MQ. Отредактируйте сообщение, которое находится в середине экрана, затем нажмите QRefresh. Наконец, щелкните правой кнопкой мыши патч и выберите Modify History->Finish Patch, который преобразует его из патча обратно в набор изменений.

О, это предполагает, что MQ является активным расширением для TortoiseHG в этом хранилище. Если нет, вы сможете нажать Файл-> Настройки, нажмите Расширения и установите флажок mq. Он должен предупредить вас о том, что вы должны закрыть TortoiseHg до того, как расширение станет активным, поэтому закройте и снова откройте.

Последняя операция была коммитом под вопросом

Чтобы изменить сообщение о коммите последнего коммита, когда последняя ртутная операция была коммитом, вы можете использовать

$ hg rollback

откат последнего коммита и повторный коммит с новым сообщением:

$ hg ci -m 'new message'

Но будьте осторожны, потому что команда rollback также выполняет откат следующих операций:

  • Импортировать
    • вытащить
    • push (с этим хранилищем в качестве пункта назначения)
    • Unbundle

(увидеть hg help rollback)

Таким образом, если вы не уверены, была ли последняя команда Mercurial hg ci, не используйте hg rollback,

Изменить любое другое сообщение коммита

Вы можете использовать расширение mq, которое распространяется вместе с Mercurial, чтобы изменить сообщение о коммите любого коммита.

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

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

Чтобы использовать расширение mq, вы должны явно включить его, например, в UNIX проверьте ~/.hgrc, который должен содержать следующие строки:

[extensions]
mq=

Скажите, что вы хотите изменить ревизию X - сначала qimport импортирует ревизии X и последующие. Теперь они зарегистрированы как стек примененных патчей. Выскакивают (qpop) полный стек, кроме X, делает X доступным для изменений через qrefresh, После того, как сообщение об изменении было изменено, вы должны снова нажать все патчи (qpop) повторно применить их, т.е. воссоздать следующие ревизии. Стек патчей не нужен, поэтому его можно удалить с помощью qfinish,

Следующий демонстрационный скрипт показывает все операции в действии. В примере сообщение коммита третьей ревизии переименовано.

# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <juser@example.org>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
  touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log 
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log 
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log 
echo INFO: Push all remaining patches
hg qpush -a
hg log 
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent

Скопируйте его в пустой каталог и выполните, например, через:

$ bash test.sh 2>&1 | tee log

Вывод должен включать исходное сообщение об изменении:

+ hg log
[..]
2   53bc13f21b04   2011-08-31 17:26 +0200   juser
  changeset message 3

И операция переименования измененного сообщения:

+ hg log
[..]
2   3ff8a832d057   2011-08-31 17:26 +0200   juser
  CHANGED MESSAGE

(Протестировано с Mercurial 1.7.5)

Как уже упоминали другие, расширение MQ гораздо больше подходит для этой задачи, и вы не рискуете разрушить свою работу. Сделать это:

  1. Включите расширение MQ, добавив что-то вроде этого в hgrc:
    [расширения]
    mq =
  2. Обновите набор изменений, который вы хотите редактировать, обычно совет:
    hg up 
  3. Импортируйте текущий набор изменений в очередь:
    hg qimport -r.
  4. Обновите патч и отредактируйте сообщение о коммите:
    hg qrefresh -e
  5. Завершите все примененные исправления (в данном случае один) и сохраните их как обычные наборы изменений:
    hg qfinish -a

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

Откат и повторное применение - действительно простое решение, но оно может помочь только с последним коммитом. Mercurial Queues - намного более мощная вещь (обратите внимание, что вам нужно включить Mercurial Queues Extension, чтобы использовать команды "hg q*").

Один хак, который я использую, если ревизия, которую я хочу отредактировать, не такая старая:

Допустим, вы на скорости 500 и хотите отредактировать 497.

hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500

Отредактируйте файл rev497 и измените сообщение. (Это после первых строк, перед которыми стоит "#")

hg import rev497
hg import rev498
hg import rev499
hg import rev500

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

Существует другой подход с расширением MQ и командами отладки. Это общий способ изменить историю без потери данных. Позвольте мне принять ту же ситуацию, что и Антонио.

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498

Небольшая жемчужина в обсуждении выше - благодаря @Codest и @Kevin Pullin. В TortoiseHg есть выпадающий параметр рядом с кнопкой фиксации. Выбор "Изменить текущую ревизию" возвращает комментарий и список файлов. ТАК полезно.

Другие вопросы по тегам