Как игнорировать все каталоги, кроме одного с помощью .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.