2010-03-07 5 views
12

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

+0

Синтаксис будет что-то больше похоже на '\ .. *' но это очень подозрительно, что вы описываете, имеющие все файлы с точкой и без. Обычно у вас не было бы точечных файлов в репо. Какие файлы вы отслеживаете? ('hg manifest') – gavinb

+0

Это, к сожалению, пока не сработало. Я немного преувеличивал, когда говорил, что есть файлы точек во всем мире, но в нескольких каталогах каждый файл имеет эквивалент в виде точечного файла. Я отредактировал .hgignore с вашим синтаксисом, выполнил 'hg addremove' и сделал фиксацию, и они все еще находятся в моем репозитории. – 2010-03-07 04:59:11

+1

Синтаксис зависит от того, используете ли вы глобальный или повторный синтаксис (например, строку формы «синтаксис: re' над директивой). Но '. *' - правильный синтаксис glob. Если файлы уже зафиксированы, вам придется удалить их отдельно (или с помощью 'hg rm. *'), И addremove не сделает этого для вас. – 2010-03-07 05:06:00

ответ

17

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

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

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

(^|/)\. 

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

$ 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 
+0

Путь, слишком тщательный. Престижность! –

0

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

syntax: regexp 

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

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

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

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

Смежные вопросы