2012-06-25 2 views
1

Есть ли безопасного способ переименовать старые фиксации (без разветвлений произошли в то же время), что некоторые пять или шесть фиксаций вниз по дороге от текущего наконечника?Переименование старой фиксация

+1

Что значит «переименовать»? У коммитов нет имен для изменения. –

+0

@PaulS - Не нужно быть слишком педантичным. Я серьезно думал, что формулировка будет понятна всем. Как изменить сообщение журнала, если хотите. – Rook

+0

Не пытаясь быть педантичным, просто не был уверен, что вы хотели сделать. Например, вы могли бы говорить о имени ветви, и у вас есть ответ, в котором говорится, как изменить название ветки. Не только я понял это неправильно. –

ответ

3

Это зависит от того, вы уже наложили эту фиксацию на публичное репо, или cointains сливается. Когда фиксация уже общедоступна, после этого невозможно изменить фиксацию. Кроме того, работа MQ не позволяет впоследствии редактировать транзакции слияния.

Когда коммит не является общедоступным, вы можете импортировать все коммиты в MQ (включить расширение mq и вызвать hg qimport -r»Revision« для каждой ревизии, где ваша фиксация является предком). Затем вы удалите все патчи с помощью hg qpop --all. После этого вы можете изменить имя филиала с помощью hg branch »name«, которое также необходимо вызвать, когда коммит действительно ввел новое имя филиала (после qpop имя ветки предка вашего коммита будет использоваться для следующих команд qpush, если ветка отсутствует имя явно задано). Если вы хотите отредактировать сообщение фиксации, вы можете сделать это с помощью hg qpush && hg qrefresh -e. Чтобы закончить редактирование, вы вызываете hg qpush --all && hg qfinish --applied.

EDIT: рабочий образец

Скажи это начальное состояние, и вы хотите редактировать 4:

8 [default] (tip) 
| 
7 
| 
6 
| 
5 
| 
4 
| 
3 
| 
2 
| 
1 
| 
0 

Теперь вы импортировать все изменения, в том числе 4, в ртутные очереди с hg qimport -r 4:8, Теперь у вас есть следующая история:

8 [default] (8.diff, qtip, tip) 
| 
7 (7.diff) 
| 
6 (6.diff) 
| 
5 (5.diff) 
| 
4 (4.diff, qbase) 
| 
3 (qparent) 
| 
2 
| 
1 
| 
0 

следующий шаг должен исключить его все патчи: hg qpop --all

3 [default] (tip) 
| 
2 
| 
1 
| 
0 

Не паникуйте, ваша история не пошла, она все еще там, в .hg/патчи. Теперь имя филиала можно задать с помощью hg branch newbranch. Это не видно в истории, пока не будет создана новая фиксация. Но название ветки может отображаться с hg branch.

Теперь первая замороженная фиксации может повторно применяться с hg qpush:

4 [newbranch] (4.diff, qbase, qtip, tip) 
| 
3 [default] (qparent) 
| 
2 
| 
1 
| 
0 

Теперь вы можете перефразировать сообщение фиксации с hg qrefresh --edit. Вы также можете изменить содержимое, отредактировав некоторые файлы в своей рабочей копии. Поэтому, если вы хотите изменить сообщение фиксации, убедитесь, что вы не изменяли файлы в своей рабочей копии до звонка hg qrefresh. Вы можете проверить это, если вы запустите hg status перед вызовом hg qrefresh.

4 [newbranch] (4.diff, qbase, qtip, tip) {new commit message} 
/
3 [default] (qparent) 
| 
2 
| 
1 
| 
0 

Вы можете редактировать дальнейшие фиксации, от навигации к каждому с hg qpush и hg qpop. Когда вы закончите, вам необходимо преобразовать ваши исправления обратно в обычную версию. Это делается путем применения всех исправлений и завершения очереди. Это делается hg qpush --all, а затем `hg qfinish --all. Теперь история выглядит следующим образом:

8 [newbranch] (tip) 
    | 
    7 
    | 
    6 
    | 
    5 
    | 
    4 {new commit message} 
/
3 [default] 
| 
2 
| 
1 
| 
0 
+0

+1 Это просто мое местное автономное репо, личного проекта. Между тем никакого слияния, ветвления или чего-либо не происходило, и нигде не было никуда. Было бы слишком много, чтобы попросить просто дать мне простой пример того, что мне нужно сделать, чтобы переименовать его? Я не понял, к сожалению, половину выше, но опять же, я использую hg довольно простым способом. – Rook

0

Поскольку это частный репо, который не был толкаемым в любом месте, оно должно быть совершенно безопасно редактировать историю. (Обратите внимание, что в общем случае, редактирование истории не является жизнеспособным вариантом.Это применимо только в том случае, если репо не было опубликовано.)

Существует множество расширений Mercurial, позволяющих редактировать историю, mq является одним из них. Однако расширение histedit, вероятно, проще в вашем случае. Он не входит в состав Mercurial, но может быть установлен довольно легко от https://www.mercurial-scm.org/wiki/HisteditExtension.

После того, как он настроен:

$ hg histedit -r $ID_OF_THE_CHANGESET_YOU_WANT_TO_EDIT 

Это откроет текстовый редактор, какие бы ни, который обычно используется для hg commit, со списком ревизий; этот список включает в себя каждый набор изменений после тот, который вы указали, поэтому прокрутите вниз. Вы увидите что-то вроде этого для каждой ревизии:

pick 2d5657b340e5 The original message for that commit 

Для ревизии вам нужно изменить, изменить pick к edit. Затем сохраните и закройте. Вернитесь к приглашению оболочки, сделайте следующее:

$ hg histedit --continue 

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

Смежные вопросы