Как изменить неверное сообщение фиксации в 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, например,.
и в tortoiseHg вы можете использовать "изменить текущую ревизию", выбрав черную стрелку справа от кнопки фиксации
последняя операция была фиксацией в вопросе
чтобы изменить сообщение фиксации последней фиксации, когда последняя операция mercurial была фиксацией, вы можете использовать
$ hg rollback
чтобы откатить последний коммит и повторно зафиксировать его с новым сообщением:
$ hg ci -m 'new message'
но будьте осторожны, потому что команда отката также откатывает следующие операции:
- импорт
- тянуть
- push (с этот репозиторий в качестве места назначения)
- разделить
(см.
hg help rollback
)таким образом, если вы не уверены, что последняя команда mercurial была
hg ci
, не используйтеhg rollback
.изменить любое другое сообщение фиксации
можно использовать расширение mq, который распространяется с Mercurial, чтобы изменить сообщение фиксации любого фиксации.
этот подход только полезно, когда в открытом доступе еще нет клонированных репозиториев, содержащих набор изменений, который вы хотите переименовать, потому что это изменяет хэш набора изменений и все последующие наборы изменений.
это означает, что вы должны иметь возможность удалить все существующие клоны, которые включают набор изменений, который вы хотите переименовать, иначе нажатие/вытягивание между ними не будет работать.
чтобы использовать расширение mq, вы должны явно включить его, например, в UNIX проверьте свой
~/.hgrc
, которым должно содержать следующие строки:[extensions] mq=
скажите, что вы хотите изменить ревизию X - first
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
(испытано с ртутью 1.7.5)
в TortoiseHg, щелкните правой кнопкой мыши на ревизию, которую вы хотите изменить. Выберите Изменить историю->импорт MQ. Это преобразует все ревизии до и включая выбранную ревизию из наборов изменений Mercurial в исправления очереди Mercurial. Выберите патч, для которого вы хотите изменить сообщение,и он должен автоматически изменить экран на редактор MQ. Отредактируйте сообщение, которое находится в середине экрана, а затем нажмите кнопку QRefresh. Наконец, щелкните правой кнопкой мыши на патч и выберите Изменить История - > закончить патч, который преобразует его из патча обратно в набор изменений.
О, это предполагает, что MQ является активным расширением для TortoiseHG в этом репозитории. Если нет, вы должны быть в состоянии нажать Файл->Настройки, выберите расширения и установите флажок mq. Он должен предупредить вас, что вы должны закрыть TortoiseHg до того, как расширение будет активно, поэтому закройте и снова откройте.
как уже упоминалось, расширение MQ гораздо больше подходит для этой задачи, и вы не рискуете уничтожить свою работу. Для этого:
- включите расширение MQ, добавив что-то вроде этого в свой hgrc:
[extensions] mq =- обновить набор изменений, который вы хотите изменить, обычно совет:
hg up <rev>- импорт текущего набора изменений в очередь:
hg qimport -r .- обновите патч и отредактируйте фиксацию сообщение:
hg qrefresh -e- завершите все примененные патчи (в данном случае один) и сохраните их как обычные наборы изменений:
hg qfinish -aЯ не знаком с TortoiseHg, но команды должны быть похожи на те, что выше. Я также считаю, что стоит упомянуть, что редактирование истории рискованно; вы должны делать это только в том случае, если вы абсолютно уверен, что набор изменений не был нажат или вытащен из другого места.
откат и повторное применение-это действительно простое решение, но оно может помочь только с последним фиксацией. Ртутные очереди-это гораздо более мощная вещь (обратите внимание, что вам нужно включить расширение Mercurial Queues для использования команд " hg q*").
Я сделал это таким образом. Во-первых, не нажимайте ваши изменения или вам не повезло. Возьмите и установите коллапс
один хак я использую, если редакция, которую я хочу редактировать, не так стара:
допустим, вы находитесь на 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
существует другой подход с расширением MQ и команды отладки. Это общий способ изменить историю без потери данных. Позвольте мне предположить ту же ситуацию, что и Антонио.
// set current tip to rev 497 hg debugsetparents 497 hg debugrebuildstate // hg add/remove if needed hg commit hg strip [-n] 498