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

Как заставить mercurial игнорировать любой файл с расширением .xxx

Я хочу, чтобы Mercurial игнорировал любой файл с определенным расширением.

Например, я хотел игнорировать файлы с расширением .SUO. (Нет необходимости управлять версиями пользовательских настроек Visual Studio.)

Итак, я изменил свой файл .hgignore на это:

syntax: glob
*.suo

Однако это не имеет никакого эффекта, и Mercurial все еще видит мой файл .suo.

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Если при запуске hg status перед изменением файла .hgignore, файл .suo имел перед ним ?, тогда его следует игнорировать. Если что-то еще (M или A, например), оно уже отслеживается репозиторием и не будет волшебным образом перестать отслеживаться. В таком случае вам нужно сделать hg remove в файле, чтобы удалить его, и hg остановить его отслеживание, или просто сделать hg forget на нем, чтобы hg остановить его отслеживание, но сохранить файл. За ним должен следовать фиксация.

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

Изменить: Mercurial выполняет только отслеживание файлов (вы не можете отслеживать пустые каталоги), но шаблоны в .hgignore просто выполняются против строк пути к файлу относительно корня репозиторий. Те же относительные пути, которые он показывает вам при запуске hg status. Поэтому он работает так, как вы говорите, что хотите, чтобы он работал, потому что следующие строки являются стандартной частью моих собственных файлов .hgignore:

syntax: glob
*\obj\*
*\bin\*
*.csproj.user
*.suo

Опять же, когда вы запускаете hg status и он показывает файл .suo, какой единственный символ находится в начале этой строки? Это символ M, A, R, ! или ?? Каков путь после него?

Ответ 2

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

Вы можете узнать больше здесь:

http://www.selenic.com/mercurial/hgignore.5.html

Обычно мы используем синтаксис регулярных выражений, чтобы гарантировать, что этот случай не является фактором в расширениях:

# use regexp syntax.
syntax: regexp
(?i)\.dcu
(?i)\.identcache
(?i)\.dof
(?i)\.dsk
(?i)\.bak
(?i)\.old

Таким образом, он гарантирует, что даже если по какой-либо причине случай расширения изменяется, он по-прежнему игнорируется.

Ответ 3

Пример игнорирования/исключения файлов с расширением .o:

.*\.o$

должен перевести на .*\.suo$ для расширений .suo.
Я успешно использовал этот метод

Ответ 4

Проверьте, где находится файл .hgignore, и убедитесь, что он находится в корневой папке $HOME или проекта. Проверьте CASE (vs case) расширения. Я сомневаюсь, что соответствие шаблонов нечувствительно к регистру.

edit: проверено, соответствие шаблону НЕ чувствительно к регистру. Следовательно, добавьте "*.SUO", если вы хотите игнорировать файлы с расширением ".SUO".