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

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


person Community    schedule 07.03.2010    source источник
comment
Синтаксис будет больше похож на \..*, но очень подозрительно, что вы описываете наличие всех файлов, с точкой и без. Обычно у вас не было бы точечных файлов в репо. Какие файлы вы отслеживаете? (hg manifest)   -  person gavinb    schedule 07.03.2010
comment
Это, к сожалению, все еще не сработало. Я немного преувеличил, когда сказал, что файлы с точками есть везде, но в некоторых каталогах каждый файл имеет эквивалент файла с точкой. Я отредактировал .hgignore с вашим синтаксисом, выполнил hg addremove и сделал фиксацию, и все они все еще в моем репозитории.   -  person    schedule 07.03.2010
comment
Синтаксис зависит от того, используете ли вы синтаксис glob или re (например, строка формы syntax: re над директивой). Но .* - это правильный синтаксис глобуса. Если файлы уже зафиксированы, вам придется удалить их по отдельности (или с помощью hg rm .*), и addremove не сделает этого за вас.   -  person    schedule 07.03.2010
comment
Выполнение sudo hg rm .* не работает. Я получаю abort: .. not under root, что не имеет для меня смысла. Все рассматриваемые скрытые файлы на самом деле являются ._ файлами, которые по какой-то причине создает OSX Finder. Я пытался запустить их встроенную утилиту dot_clean, но получаю undouble . failed. Очень расстраивает.   -  person    schedule 07.03.2010
comment
Тьфу... Я даже попробовал sudo hg rm ._*, но он говорит мне not removing ._*: file is untracked, но когда я получаю hg manifest, я вижу множество ._ файлов!   -  person    schedule 07.03.2010
comment
Я думаю, проблема в том, что hg rm .* не рекурсивно перемещается по каталогам. Есть ли способ заставить это сделать это?   -  person    schedule 07.03.2010


Ответы (2)


Вы получили почти правильный ответ в комментариях от 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

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

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

(^|/)\.

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

$ 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 не действует после добавления файла. Это предотвратит добавление подстановочных знаков, но вы всегда можете переопределить .hgignore явным образом hg add. и как только файлы были добавлены, hgignore больше не консультируется.

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

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

(^|/)\._

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

find . -type f -name "._*" -print0 |xargs -0 hg rm
person Ry4an Brase    schedule 07.03.2010
comment
Слишком, слишком тщательно. Слава! - person Wes Johnson; 22.10.2014

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

syntax: regexp

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

Который гласит: точки, которым не предшествует что-то, кроме косой черты.

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

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

person mpen    schedule 05.04.2016