Как работают шаблоны с отрицанием в .gitignore? - PullRequest
71 голосов
/ 12 мая 2010

Я пытаюсь использовать файл .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 ]

126 голосов
/ 12 мая 2010

Я думаю, что вы действительно хотите сделать:

aaa/*
!aaa/ccc

Вы говорите, что "не смотрите в aaa", поэтому он даже не проверяет путь aaa/ccc. Если вы используете подстановочный знак, он все равно читает содержимое aaa, тогда каждая запись соответствует подстановочному знаку и игнорируется, за исключением aaa/ccc, который возвращается обратно.

14 голосов
/ 06 января 2014

Если вы хотите исключить все в aaa, но включить aaa/ccc и все, что ниже, вы должны использовать:

aaa/*
!aaa/ccc
!aaa/ccc/*

В первой строке git следует игнорировать все, что находится ниже aaa, во второй - не игнорировать папку aaa/ccc, которая фактически «включает» третью строку, которая затем говорит ей не игнорировать все, что находится ниже aaa/ccc.

1 голос
/ 28 февраля 2015

Если кто-то все еще не видит вновь игнорируемые элементы в git status, выполняющем git update-index до того, как рука может помочь git увидеть изменения (по крайней мере, в версии 1.9.x из gitbash).

...