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

StackOverflow https://stackoverflow.com/questions/623052

Вопрос

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

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

Это было полезно?

Решение

Обновить: 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 только что добавленный мерзавец , как --amend вариант.

а в TortoiseHg вы можете использовать "Изменить текущую редакцию", выбрав черную стрелку справа от кнопки фиксации

a

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

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

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

Чтобы изменить сообщение о фиксации последней фиксации, когда последней операцией 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 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 changesets включительно в исправления Mercurial Queue.Выберите исправление, для которого вы хотите изменить сообщение, и оно должно автоматически изменить экран на MQ editor.Отредактируйте сообщение, которое находится в середине экрана, затем нажмите 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 для того, чтобы использовать команды "hg q *").

Я сделал это таким образом.Во-первых, не настаивайте на своих изменениях, иначе вам не повезет.Возьмите и установите коллапс расширение.Зафиксируйте еще один фиктивный набор изменений.Затем используйте collapse, чтобы объединить предыдущие два набора изменений в один.Он предложит вам ввести новое сообщение о фиксации, предоставляя вам сообщения, которые у вас уже есть в качестве отправной точки.Вы фактически изменили свое исходное сообщение о фиксации.

Один хак, который я использую, если редакция, которую я хочу отредактировать, не такая старая:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top