Как работают шаблоны с отрицанием в.gitignore?
Я пытаюсь использовать файл.gitignore с отрицательными шаблонами (строки начинаются с!), Но он работает не так, как я ожидаю.
Как минимальный пример, у меня есть следующая структура каталогов:
C:/gittest
-- .gitignore
-- aaa/
-- bbb/
-- file.txt
-- ccc/
-- otherfile.txt
и в моем файле gitignore у меня есть это:
aaa/
!aaa/ccc/
Насколько я понимаю (основываясь на этой странице документа), файл aaa / ccc / otherfile.txt не следует игнорировать, но на самом деле git игнорирует все под aaa.
Я неправильно понимаю это предложение: "Необязательный префикс!, Который отменяет шаблон; любой соответствующий файл, исключенный предыдущим шаблоном, снова будет включен".?
Кстати, это на Windows с msysgit 1.7.0.2.
3 ответа
Я думаю, что вы на самом деле хотите:
aaa/*
!aaa/ccc
Вы говорите "не смотри в aaa
"Так что он даже не исследует путь aaa/ccc
, Если вы используете подстановочный знак, он все равно читает содержимое aaa
, то каждая запись соответствует шаблону и игнорируется, кроме aaa/ccc
который возвращается обратно.
Если вы хотите исключить все в aaa
, но включить aaa/ccc
и все, что под ним, вы должны использовать:
aaa/*
!aaa/ccc
!aaa/ccc/*
Первая строка говорит Git игнорировать все, что ниже aaa
второй говорит не игнорировать папку aaa/ccc
который фактически "включает" третью строку, которая затем говорит ей не игнорировать все ниже aaa/ccc
,
Если кто-то все еще не видит недавно проигнорированные предметы в git status
работает git update-index
перед рукой может помочь git увидеть изменения (по крайней мере, в версии 1.9.x gitbash).