Mercurial (hg) фиксирует только определенные файлы

119

Я пытаюсь зафиксировать только определенные файлы с помощью Mercurial. Из-за того, что hg имеет автоматическое добавление всякий раз, когда я пытаюсь зафиксировать изменение, он хочет зафиксировать все файлы. Но я не хочу этого, потому что некоторые файлы еще не «готовы».

Там есть

hg commit -I thefile.foo

но это только для одного файла. Для меня было бы лучше, если бы я мог отключить автоматическое добавление, как в Git. Это возможно?

Правин Кумар Пурушотаман
источник
5
использовать расширение записи? или вы можете указать файлы в командной строкеhg ci foo bar baz
tonfa
4
@tonfa, перепубликуйте свой комментарий как ответ
Андрей Дзяхель
Пожалуйста, не портите свои сообщения.
Глорфиндель
Почему ты оскорбляешь такого приятного вопросительного парня?
Правин Кумар Пурушотаман

Ответы:

155

Вы можете указать файлы в командной строке, как пишет tonfa:

$ hg commit foo.c foo.h dir/

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

$ hg commit -I foo.c -I "**/*.h"

Вы даже можете использовать набор файлов для выбора файлов, которые хотите зафиксировать:

$ hg commit "set:size(1k - 1MB) and not binary()"

Нет настройки, которая отключила бы автоматическое добавление и заставила Mercurial работать так, как это делает Git. Однако расширение mq может быть интересно. Это расширенное расширение, но оно позволяет

$ hg qnew feature-x     # create new patch
$ hg qrefresh -s foo.c  # add a file to the current patch
$ hg qrefresh -s bar.c  # add another file to the patch
$ hg qfinish -a         # convert applied patches to normal changesets

Я лично не использую MQ для этой цели, поскольку считаю, что достаточно просто указать имена файлов в командной строке.

Мартин Гейслер
источник
Какое поведение "автоматическое добавление"? Используется ли hg для автоматического добавления файлов? Потому что теперь вы должны сделать это явно, иначе они не будут отслеживаться.
mpen 06
1
@mpen Я думаю, он имеет в виду, как gh автоматически добавляет каждый измененный файл в коммит, в отличие от git, в котором вы должны вручную добавлять измененные файлы в следующую фиксацию, и может оставить некоторые измененные файлы незафиксированными
simpleuser
24

Если вы хотите зафиксировать несколько файлов и исключить многие другие, явно укажите файлы, которые вы хотите зафиксировать. -Iнужен только в том случае, если вы хотите использовать шаблоны вместо файлов.

Если вы хотите зафиксировать много файлов и исключить только несколько файлов, использование -Xболее удобно.

Например, для репозитория, содержащего "файл_1", "файл_2" и "файл_3", следующие значения эквивалентны, но последнее легче / быстрее набирать:

hg commit file_1 file_2
hg commit -X file_3
Роб В
источник
8

Начиная с 3.8 вы также можете использовать hg commit --interactiveдля выбора файлов (до 3.8 вы можете использовать расширение crecord для аналогичных функций). --interactive(Или только -i) флаг будет вызывать рт.ст. запрашивать у вас файлы , которые вы хотите включить в коммит. В качестве дополнительного бонуса вы даже можете включать / исключать фрагменты файлов.

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

Обратите внимание, чтобы получить этот интерфейс, вам необходимо включить интерфейс curses. Вы можете сделать это для одиночного прогона с помощью hg commit --config ui.interface=curses --interactiveили в целом, добавив следующее к вашему .hgrc:

[ui]
interface = curses
studgeek
источник