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

В настоящее время я использую TortoiseHg (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 вы можете использовать "Изменить текущую ревизию", выбрав черную стрелку справа от кнопки фиксации

a

Ответ 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 есть опция выпадающего списка рядом с кнопкой фиксации. Выбор "Изменить текущую ревизию" возвращает комментарий и список файлов. Полезно.