Я ненавижу видеть, как почти каждый каталог в моем репозитории перечисляет каждый файл дважды, один раз с точкой перед ним и один раз без. Я попытался добавить .*
в свой файл .hgignore, но это не дало результата. Это неправильный синтаксис, и, что более важно, это плохая идея, чтобы попробовать это в первую очередь? Спасибо.
Как заставить mercurial игнорировать все скрытые файлы?
Ответы (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
Я использую это в своем .hgignore
:
syntax: regexp
# dotfiles
(?<![^/])\.
Который гласит: точки, которым не предшествует что-то, кроме косой черты.
Решение Ry4an тоже хорошее, я тоже использовал его раньше. Не уверен, что эффективнее.
https://regex101.com/r/dB4bW7/1
\..*
, но очень подозрительно, что вы описываете наличие всех файлов, с точкой и без. Обычно у вас не было бы точечных файлов в репо. Какие файлы вы отслеживаете? (hg manifest
) - person gavinb   schedule 07.03.2010hg addremove
и сделал фиксацию, и все они все еще в моем репозитории. - person   schedule 07.03.2010syntax: re
над директивой). Но.*
- это правильный синтаксис глобуса. Если файлы уже зафиксированы, вам придется удалить их по отдельности (или с помощьюhg rm .*
), и addremove не сделает этого за вас. - person   schedule 07.03.2010sudo hg rm .*
не работает. Я получаюabort: .. not under root
, что не имеет для меня смысла. Все рассматриваемые скрытые файлы на самом деле являются._
файлами, которые по какой-то причине создает OSX Finder. Я пытался запустить их встроенную утилитуdot_clean
, но получаюundouble . failed
. Очень расстраивает. - person   schedule 07.03.2010sudo hg rm ._*
, но он говорит мнеnot removing ._*: file is untracked
, но когда я получаюhg manifest
, я вижу множество._
файлов! - person   schedule 07.03.2010hg rm .*
не рекурсивно перемещается по каталогам. Есть ли способ заставить это сделать это? - person   schedule 07.03.2010