Как работают шаблоны с отрицанием в.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).

Другие вопросы по тегам