Как изменить неверное сообщение фиксации в Mercurial? [дубликат]


этот вопрос уже есть ответ здесь:

в настоящее время я использую TortoiseHg (Mercurial) и случайно зафиксировал неверное сообщение о фиксации. Как мне изменить это сообщение фиксации в репозитории?

12 325

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

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

(испытано с ртутью 1.7.5)

в TortoiseHg, щелкните правой кнопкой мыши на ревизию, которую вы хотите изменить. Выберите Изменить историю->импорт MQ. Это преобразует все ревизии до и включая выбранную ревизию из наборов изменений Mercurial в исправления очереди Mercurial. Выберите патч, для которого вы хотите изменить сообщение,и он должен автоматически изменить экран на редактор MQ. Отредактируйте сообщение, которое находится в середине экрана, а затем нажмите кнопку QRefresh. Наконец, щелкните правой кнопкой мыши на патч и выберите Изменить История - > закончить патч, который преобразует его из патча обратно в набор изменений.

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

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