Как игнорировать все каталоги, кроме одного с помощью .hgignore?
Я управляю $HOME с помощью Mercurial, чтобы сохранить мои точечные файлы и отслеживать их, или, по крайней мере, те, которые важны для меня.
Однако есть множество файлов и каталогов в ~, которые не нужно отслеживать, и этот набор постоянно меняется и постоянно растет.
Исторически я имел дело с этим, имея этот .hgignore:
syntax: glob
*
Это сохраняет мой статус в чистоте, насколько это возможно, делая видимыми только ранее отслеживаемые файлы. Однако у меня есть несколько каталогов (в моем случае scripts
, .emacs.d
), которые я хотел бы видеть в файлах без следа; Я почти всегда хочу отслеживать новые дополнения к этим каталогам.
Я знаю, что я могу запустить hg st -u scripts
для идентификации невоспроизводимых файлов, но я хочу, чтобы я мог достичь той же функции, используя обычный статус ole hg.
Есть ли способ сделать это?
Ответы
Ответ 1
Попробуйте это вместо .hgignore
:
syntax: regexp
^(?!(scripts|foo|bar)/)[^/]+/
-
^
соответствует началу пути
-
(?!(scripts|foo|bar)
использует отрицательный lookahead для игнорирования всех файлов, кроме тех, что указаны в каталогах scripts
, foo
или bar
-
/)
гарантирует, что каталоги, которые имеют отслеживаемый каталог в качестве префикса, игнорируются
-
[^/]+/
тогда фактически соответствует любой директории (исключая те, которые были исключены из lookahead), поэтому файлы в ~
не игнорируются
Кредит за центральную идею в этом решении (негативный взгляд) идет на Майкла Ла Фой ответить на этот вопрос
Ответ 2
Этот вопрос задавался здесь на SO довольно много раз, и вы получите много запутанных ответов, используя утверждения с отрицательной оценкой в нулевой ширине, часто злоупотребляемый трюк с регулярным выражением, но лучшие решения - либо (a ) просто сделайте репо только в этом каталоге или (б) просто добавьте файлы в этот каталог. Для параметра (b) вы просто поместите .*
в свой .hgignore
файл, чтобы игнорировать все, а затем вручную hg add
файлы, которые вы хотите отслеживать. В mercurial, в отличие от svn и cvs, вы можете переопределить игнорирование с помощью add.