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

Как заставить mercurial игнорировать все скрытые файлы?

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

4b9b3361

Ответ 1

У вас почти правильный ответ в комментариях от gavinb, но матч был немного шире. Однако ключевая концепция игнорирования после лица была предоставлена ​​RogerPage, снова в комментарии (что, когда все предпочитают комментарии к ответам?).

Посмотрите на эти девять файлов:

dir.with.dots/file.with.dots
dir.with.dots/filewithoutdots
dir.with.dots/.filestartwithdot
dirwithoutdots/file.with.dots
dirwithoutdots/filewithoutdots
dirwithoutdots/.filestartwithdot
.startwithdot/file.with.dots
.startwithdot/filewithoutdots
.startwithdot/.filestartwithdot

Если в режиме регулярного выражения по умолчанию для hgignore вы делаете:

\..*

Вы игнорируете восемь из этих девяти файлов:

$ hg stat -i
I .hgignore
I .startwithdot/.filestartwithdot
I .startwithdot/file.with.dots
I .startwithdot/filewithoutdots
I dir.with.dots/.filestartwithdot
I dir.with.dots/file.with.dots
I dir.with.dots/filewithoutdots
I dirwithoutdots/.filestartwithdot
I dirwithoutdots/file.with.dots

который более широк, чем вы сказали. Он игнорирует что-либо с точкой в любом месте.

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

(^|/)\.

в котором говорится, что вещь перед буквальной точкой должна быть началом строки (^) или косой чертой.

$ hg stat -i
I .hgignore
I .startwithdot/.filestartwithdot
I .startwithdot/file.with.dots
I .startwithdot/filewithoutdots
I dir.with.dots/.filestartwithdot
I dirwithoutdots/.filestartwithdot

Это поймало только файлы или каталоги, начинающиеся с точки.

Однако другая ключевая концепция, которая возникла, заключалась в том, что .hgignore не имеет эффекта после добавления файла. Это предотвратит добавление с помощью wild card, но вы всегда можете переопределить .hgignore с явным hg add. и после того, как файлы были добавлены, hgignore больше не проконсультируется.

Это действительно удобно, потому что вы можете игнорировать широко (ex: .*\.jar), а затем добавлять исключения, которые вы хотите вручную, без необходимости futz с вашим файлом hgignore. Однако в этом случае это означает, что вам нужно hg rm файлы, которые вы уже добавили случайно, и tonfa показал, как это сделать (пока в ваших файлах нет пробелов).

В конце это похоже на то, что вы хотите в файле .hgignore:

(^|/)\._

и что вам нужно удалить те, которые вы уже добавили:

find . -type f -name "._*" -print0 |xargs -0 hg rm

Ответ 2

Я использую это в своем .hgignore:

syntax: regexp

# dotfiles
(?<![^/])\.

Что читается: периоды, которым не предшествует нечто иное, кроме косой черты.

Решение Ry4an тоже хорошо, я тоже использовал его. Не уверен, что более эффективно.

https://regex101.com/r/dB4bW7/1