Как отредактировать неверное сообщение фиксации в Mercurial? [дубликат]
этот вопрос уже есть ответ здесь:
в настоящее время я использую TortoiseHg (Mercurial) и случайно совершил неправильное сообщение фиксации. Как мне отредактировать это сообщение фиксации в репозитории?
12 ответов
обновление: Mercurial добавил --amend
Что должно быть предпочтительный вариант сейчас.
вы можете откатить последнюю фиксацию (но только последнюю) с помощью hg rollback
и затем повторно примените его.
важно: это навсегда удаляет последнюю фиксацию (или тянуть). Так что если вы сделали hg update
эта фиксация больше не находится в вашем рабочем каталоге, тогда она ушла навсегда. так сделайте копию первый.
кроме этого, вы не можете изменить историю репозитория (включая сообщения фиксации), потому что все там проверено-суммировано. Единственное, что вы можете сделать, это обрезать историю после данного набора изменений, а затем воссоздать ее соответствующим образом.
ничего из этого не будет работать, если вы уже опубликовали свои изменения (если вы не можете получить все копии), и вы также не можете "переписать историю", которая включает подписанные GPG коммиты (другими людьми).
Ну, я раньше так делал:
представьте, что у вас есть 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
хорошие новости: 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
(протестировано с Mercurial 1.7.5)
в TortoiseHg щелкните правой кнопкой мыши ревизию, которую вы хотите изменить. Выберите Изменить историю - >импортировать MQ. Это преобразует все ревизии до и включая выбранную ревизию из наборов изменений Mercurial в исправления очереди Mercurial. Выберите патч, для которого вы хотите изменить сообщение, и он должен автоматически изменить экран на редактор MQ. Отредактируйте сообщение, которое находится в середине экрана, затем нажмите QRefresh. Наконец, щелкните правой кнопкой мыши на патч и выберите Изменить История - > Finish Patch, который преобразует его из патча обратно в набор изменений.
О, это предполагает, что MQ является активным расширением для TortoiseHG в этом репозитории. Если нет, вы должны иметь возможность нажать Файл->Настройки, нажмите расширения и установите флажок mq. Он должен предупредить вас, что вы должны закрыть TortoiseHg до того, как расширение будет активно, поэтому закройте и снова откройте.
как упоминали другие, расширение MQ гораздо больше подходит для этой задачи, и вы не рискуете разрушить свою работу. Для этого:
- включите расширение MQ, добавив что-то вроде этого в свой hgrc:
[extensions] mq =
- обновление до набора изменений, который вы хотите изменить, обычно совет:
hg up <rev>
- импортировать текущий набор изменений в очередь:
hg qimport -r .
- обновите патч и отредактируйте фиксацию сообщение:
hg qrefresh -e
- завершите все примененные исправления (в данном случае один) и сохраните их как обычные наборы изменений:
hg qfinish -a
Я не знаком с TortoiseHg, но команды должны быть аналогичны приведенным выше. Я также считаю, что стоит упомянуть, что редактирование истории рискованно; вы должны делать это, только если вы абсолютно уверен, что набор изменений не был нажат или вытащен из другого места.
Rollback-and-reapply-очень простое решение, но оно может помочь только с последней фиксацией. Mercurial очереди гораздо более мощная вещь (обратите внимание, что вам нужно включить расширение 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
маленький драгоценный камень в обсуждении выше-благодаря @Codest и @Kevin Pullin. В TortoiseHg рядом с кнопкой фиксации есть раскрывающийся список. Выбор "изменить текущую редакцию" возвращает комментарий и список файлов. настолько полезный.