Подтвердить что ты не робот

Изменения меркурийной вишни для фиксации

Скажем, я внес много изменений в свой код и мне нужно только зафиксировать некоторые из этих изменений. Есть ли способ сделать это в меркуриальном? Я знаю, что darcs имеет такую ​​функцию, как этот.

Я знаю, что hg transplant может делать это между ветвями, но мне нужно что-то подобное для совершения кода в текущей ветке, а не при добавлении наборов изменений из какой-либо другой ветки.

4b9b3361

Ответ 1

MQ, как упоминал Чад, - это один из способов. Там также более легкие решения:

  • Расширение записи, которое работает примерно так же, как запись darcs. Он распространяется с помощью меркуриального.
  • Расширение Shelve, которое позволяет вам "откладывать" определенные изменения, позволяя вам фиксировать только подмножество ваших изменений (те, которые не отложен)

Ответ 2

Если вы используете TortoiseHg 1.x для Windows, эта функция прекрасно реализована прямо из (никаких расширений не требуется).

  • Запустите инструмент TortoiseHg Commit Tool.
  • Выберите файл, для которого вы только хотите зафиксировать подмножество своих изменения.
  • Нажмите на Hunk Вкладка "Предварительный просмотр" в панели предварительного просмотра.
  • Дважды щелкните или используйте пробел, чтобы переключить, какие изменения должны быть включен в commit.

Для TortoiseHg 2.x вкладка Выбор Hunk теперь отсутствует. На его месте находится инструмент Shelve. Он имеет еще несколько функций, чем старый выбор. Эти новые функции стоят за счет некоторой дополнительной сложности.

enter image description here

Обратите внимание, что при использовании этой функции нет необходимости явно включать расширение Mercurial Shelve. По словам Стив Борхо (ведущий разработчик TortoiseHg) в Ответ на другой вопрос TortoiseHg: "У нас есть локальный копию расширения полки и прямое обращение к нему".


Для TortoiseHg 2.7 + эта функциональность была улучшена и обновлена. Теперь он встроен непосредственно в инструмент Commit:

example of change selection in the commit tool

Обратите внимание, что в списке файлов слева, который указан в верхнем файле, чтобы указать, что он будет включен, второй файл не установлен, потому что он не будет включен, а третий файл Sample.txt заполнен (Null checkbox), потому что в фиксацию будут включены только изменения из этого файла.

Изменение в Sample.txt, которое будет включено, проверяется в нижней части выбора изменения изображения. Изменения, которые будут исключены, не будут отмечены, а представление diff будет выделено серым цветом. Также обратите внимание, что значок инструмента для полки по-прежнему доступен.

Ответ 3

Учебник Mercurial Queues ужасен для этого варианта использования. Все примеры, которые я видел, предполагают, что вам еще предстоит совершить фиксацию, и вы обновляете один патч. В большинстве случаев это не так, и у вас есть 2 или 3 фиксации, которые вы хотите сквозировать или изменить каким-либо другим способом.

Допустим, у вас есть такая история:

---O---O---A---B---C

Первый пример - сквош совершает A, B и C. Первый init mq:

$ hg qinit

Теперь нам нужно "импортировать" коммиты A, B и C в очередь исправлений. Предположим, что они являются последними 3 коммитами. Мы можем использовать синтаксис "-N" для их импорта так:

$ hg qimport -r -3:-1

Это означает, что импорт в виде патчей из 3 патчей возвращается к последнему фиксации. Вы можете проверить статус этих патчей с помощью hg qseries. Он должен показать что-то вроде этого:

$ hg qseries
101.diff
102.diff
103.diff

Если номера 101, 102 и 103 соответствуют местным номерам ревизий коммитов A, B и C. Теперь эти исправления применяются, что означает, что изменения, которые они описывают, уже находятся в рабочей копии. Вы можете избавиться от изменений рабочей копии и удалить их из истории коммитов, сохранив их только в форме патча, используя hg qpop. Вы можете сказать hg qpop; hg qpop, чтобы поменять изменения C и B со стека, или указать патч для "pop to". В этом случае это будет примерно так:

$ hg qpop 101.diff
now at: 101.diff

Теперь у вас есть исправления для коммитов B и C в очереди исправлений, но они не применяются (их изменения были "потеряны" - они существуют только в области очереди патчей). Теперь вы можете складывать эти патчи в последний, т.е. Мы создаем новую фиксацию, которая эквивалентна сумме изменений A + B + C.

$ hg qfold -e 102.diff 103.diff

Это покажет ваш редактор, чтобы вы могли изменить сообщение фиксации. По умолчанию сообщение будет конкатенацией сообщений фиксации для изменений A, B и C, разделенных звездочками. Приятно отметить, что hg qfold будет заполнять патчи, если вы используете bash, и получите доступ к hg-завершению script. Это оставляет историю, подобную этой, где A + B + C является единственной фиксацией, которая представляет собой комбинацию из 3 патчей, которые нас интересуют:

---O---O---A+B+C

Другой вариант использования - если у нас такая же история, как раньше, но мы хотим удалить патч B и слить A + C. Это на самом деле похоже на выше. Когда вы переходите на шаг qfold, вы просто складываете последнее коммит, а не последние 2 коммита:

$ hg qfold -e 103.diff

Это оставляет изменение для B в очереди исправлений, но оно не применяется к рабочей копии, и ее фиксация не находится в истории. Вы можете увидеть это, выполнив:

$ hg qunapplied
102.diff

Теперь история выглядит так, где A + C - это одно коммит, который объединяет изменения A и C:

---O---O---A+C

Конечным вариантом использования может быть то, что вам нужно применить только commit C. Вы сделали бы это, запустив qimport, как указано выше, и вы вытащите все исправления, которые вам не нужны:

$ hg qpop -a

Флаг -a означает выключение всех патчей. Теперь вы можете применить только тот, который вам нужен:

$ hg qpush 103.diff

Это оставляет вам эту историю:

---O---O---C

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

$ hg qfinish -a

Итак, вот и мы. Теперь вы можете запустить hg push и выполнить только то, что хотите, или hg email связный патч в списке рассылки.

Ответ 4

Я чувствую, что у меня что-то не хватает, потому что никто этого не предложил.

Обычная команда "hg commit" может использоваться для выборочного выбора того, что нужно совершить (вам не нужно фиксировать все ожидающие изменения в локальном рабочем каталоге).

Если у вас есть такой набор изменений:

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

Вы можете зафиксировать только два из этих изменений с помощью...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

Не супер удобно из командной строки, потому что вы должны вручную вводить файлы для выборочного фиксации (против процесса check-box графического интерфейса, такого как черепаха), но он настолько же прост, как и он, и не требует никаких расширений. И файло-глобализация, вероятно, может помочь уменьшить типизацию (как это было выше, оба зафиксированных файла однозначно передают "liferay" в их именах путей.

Ответ 5

Вы можете использовать расширение , которое распространяется вместе с Mercurial.

Сначала вы должны включить его в свой ~/.hgrc файл, добавив его в раздел [extensions]:

[extensions]
record=

Затем просто введите hg record вместо hg commit, и вы сможете выбрать, какие изменения будут исправлены.

Вы также можете использовать расширение crecord, которое обеспечивает более удобный интерфейс для просмотра и выбора изменений. (Однако он не распространяется вместе с Mercurial, и я видел, как он иногда испортил коммит, чтобы он не был полностью без ошибок.)

Ответ 7

Попробуйте qct (Qt Commit Tool). Он имеет функцию "выбрать изменения", которая запускает трехсторонний инструмент слияния, чтобы вы могли отменить отдельные изменения. После того, как вы зафиксируете, те изменения, которые вы "расстегнули", возвращаются.

Ответ 8

Я использую commit-patch. Это script, который позволяет редактировать diff перед фиксацией. Это действительно приятно с Emacs diff-mode и vc-mode.

В прошлом я использовал crecord, но у него есть ошибки, связанные с unicode (на самом деле расширение записи имеет ошибки, от которых зависит crecord).

Ответ 9

Прошло некоторое время. Кажется, лучший вариант теперь hg commit --interactive

Ответ 10

Сначала вы должны забыть все, что вы когда-либо знали о графическом интерфейсе, и вернуться в командную строку. Далее из командной строки выполните следующее:

hg stat > filelist.txt

Это переводит все ваши измененные файлы в текстовый файл с именем filelist.txt

Далее отредактируйте свой список файлов, чтобы включить только файлы, которые вы хотите зафиксировать.

Наконец, завершите использование набора файлов sytnax:

hg commit "set: 'listfile: test.txt'"