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

a


Я знаю, что это старый пост, и вы отметили вопрос как ответ. Я искал то же самое недавно, и я нашел


последняя операция была фиксацией в вопросе

чтобы изменить сообщение фиксации последнего фиксации, когда последняя операция 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 гораздо больше подходит для этой задачи, и вы не рискуете разрушить свою работу. Для этого:

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