В настоящее время я использую TortoiseHg (Mercurial) и случайно совершил неправильное сообщение фиксации. Как мне отредактировать это сообщение фиксации в репозитории?
Как редактировать неверное сообщение комманды в Mercurial?
Ответ 1
Обновление: Mercurial добавил --amend
, который должен быть предпочтительным вариантом.
Вы можете отменить последнюю фиксацию (но только последнюю) с помощью hg rollback
, а затем повторно применить ее.
Важно: этот навсегда удаляет последнюю фиксацию (или тянуть). Поэтому, если вы сделали hg update
, что commit больше не находится в вашем рабочем каталоге, тогда он ушел навсегда. Поэтому сначала сделайте копию.
Кроме этого, вы не можете изменить историю репозитория (включая сообщения о фиксации), потому что все в нем есть чек-сумма. Единственное, что вы можете сделать, это обрезать историю после заданного набора изменений, а затем воссоздать ее соответствующим образом.
Ничто из этого не будет работать, если вы уже опубликовали свои изменения (если только вы не можете получить все копии), и вы также не можете "переписать историю", в которую включены подписанные GPG коммиты (другими людьми).
Ответ 2
Ну, я так делал:
Представьте, у вас есть 500 коммитов, а ваше ошибочное сообщение фиксации находится в r.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
Ответ 3
Хорошие новости: hg 2.2 только что добавил git как опция --amend
.
и в tortoiseHg вы можете использовать "Изменить текущую ревизию", выбрав черную стрелку справа от кнопки фиксации
Ответ 4
Я знаю, что это старый пост, и вы ответили как вопрос. Я искал то же самое недавно, и я нашел расширение histedit
очень полезным. Процесс объясняется здесь:
http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html
Ответ 5
Последняя операция была связана с фиксацией
Чтобы изменить сообщение фиксации последнего коммита, когда последним меркуриальным действием является фиксация, вы можете использовать
$ hg rollback
откат последнего фиксации и повторная фиксация его с помощью нового сообщения:
$ hg ci -m 'new message'
Но будьте осторожны, потому что команда отката также откатывается после следующих операций:
- импорт
- тянуть
- push (с этим репозиторием в качестве адресата)
- Unbundle
(см. hg help rollback
)
Таким образом, если вы не уверены, что последняя команда mercurial была hg ci
, не используйте hg rollback
.
Изменить любое другое сообщение фиксации
Вы можете использовать расширение mq, которое распространяется вместе с Mercurial, чтобы изменить сообщение фиксации любой фиксации.
Этот подход полезен только тогда, когда в публике нет клонированных репозиториев, которые содержат набор изменений, который вы хотите переименовать, потому что это изменяет хэш хэша и его следующие изменения.
Это означает, что вы должны иметь возможность удалить все существующие клоны, которые включают набор изменений, который вы хотите переименовать, иначе нажатие/вытягивание между ними не будет работать.
Чтобы использовать расширение mq, вы должны явно включить его, например. под UNIX проверьте свой ~/.hgrc
, который должен содержать следующие строки:
[extensions]
mq=
Предположим, что вы хотите изменить версию X - сначала qimport
импортирует ревизии X и далее. Теперь они зарегистрированы как стек прикладных патчей. Popping (qpop
) полный стек, кроме X, делает X доступным для изменений через qrefresh
. После изменения сообщения фиксации вам нужно снова нажать все исправления (qpop
), чтобы повторно применить их, т.е. Воссоздать следующие изменения. Стек патчей не нужен, поэтому его можно удалить с помощью qfinish
.
После демонстрации script показаны все действия в действии. В этом примере сообщение commit третьего набора изменений переименовывается.
# 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 <[email protected]>' >> .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)
Ответ 6
В TortoiseHg щелкните правой кнопкой мыши ревизию, которую вы хотите изменить. Выберите "Изменить историю → Импорт MQ". Это преобразует все ревизии вплоть до выбранной ревизии из наборов Mercurial в пакеты исправлений Mercurial Queue. Выберите патч, для которого вы хотите изменить сообщение, и оно должно автоматически изменить экран в редакторе MQ. Измените сообщение, находящееся в середине экрана, затем нажмите QRefresh. Наконец, щелкните правой кнопкой мыши на патче и выберите "Изменить историю" - "Финишная патч", которая преобразует его из патча обратно в набор изменений.
О, это предполагает, что MQ является активным расширением для TortoiseHG в этом репозитории. Если нет, вы можете щелкнуть "Файл- > Настройки", "Расширения" и установить флажок mq. Он должен предупредить вас, что вам нужно закрыть TortoiseHg до того, как расширение будет активным, поэтому закройте и снова откройте.
Ответ 7
Как уже отмечалось, расширение MQ намного более подходит для этой задачи, и вы не рискуете уничтожить свою работу. Для этого:
- Включите расширение MQ, добавив что-то подобное вашему hgrc:
[extensions] mq =
- Обновите набор изменений, который хотите изменить, обычно подсказка:
hg up <rev>
- Импортировать текущий набор изменений в очередь:
hg qimport -r .
- Обновите патч и отредактируйте сообщение фиксации:
hg qrefresh -e
- Завершите все прикладные патчи (в этом случае, и в этом случае) и сохраните их в качестве обычных наборов изменений:
hg qfinish -a
Я не знаком с TortoiseHg, но команды должны быть похожи на команды выше. Я также считаю, что стоит упомянуть, что история редактирования рискованна; вам следует сделать это, только если вы абсолютно уверены, что набор изменений не был нажат или вытащил из другого места.
Ответ 8
Откат и повторное применение - это очень простое решение, но оно может помочь только с последним фиксацией. Mercurial Queues - гораздо более мощная вещь (обратите внимание, что вам нужно включить расширение Mercurial Queues, чтобы использовать команды "hg q *" ).
Ответ 9
Я сделал это так. Во-первых, не подталкивайте свои изменения или вам не повезло. Захватите и установите расширение collapse. Зафиксируйте еще один фиктивный набор изменений. Затем используйте коллапс для объединения двух предыдущих наборов изменений в один. Он предложит вам новое сообщение о фиксации, предоставив вам сообщения, которые у вас уже есть в качестве отправной точки. Вы действительно изменили свое исходное сообщение фиксации.
Ответ 10
Один взломанный я использую, если ревизия, которую я хочу изменить, не так старка:
Скажем, вы на rev 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
Ответ 11
Существует другой подход с расширением MQ и команды отладки. Это общий способ изменения истории без потери данных. Позвольте мне предположить ту же ситуацию, что Антонио.
// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498
Ответ 12
Немного драгоценного камня в обсуждении выше - благодаря @Codest и @Kevin Pullin. В TortoiseHg есть опция выпадающего списка рядом с кнопкой фиксации. Выбор "Изменить текущую ревизию" возвращает комментарий и список файлов. Полезно.