Как отредактировать неверное сообщение о коммите в 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 гораздо больше подходит для этой задачи, и вы не рискуете разрушить свою работу. Сделать это:
- Включите расширение MQ, добавив что-то вроде этого в hgrc:
[расширения] mq =
- Обновите набор изменений, который вы хотите редактировать, обычно совет:
hg up
- Импортируйте текущий набор изменений в очередь:
hg qimport -r.
- Обновите патч и отредактируйте сообщение о коммите:
hg qrefresh -e
- Завершите все примененные исправления (в данном случае один) и сохраните их как обычные наборы изменений:
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 есть выпадающий параметр рядом с кнопкой фиксации. Выбор "Изменить текущую ревизию" возвращает комментарий и список файлов. ТАК полезно.