Як працюють заперечені шаблони в .gitignore?


92

Я намагаюся використовувати файл .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.

Відповіді:


158

Я думаю, що ви насправді хочете зробити, це:

aaa/*
!aaa/ccc

Ви говорите йому "не заглядайте aaa", тому воно навіть ніколи не вивчає шлях aaa/ccc. Якщо ви використовуєте підстановку, вона все одно читає вміст aaa, тоді кожен запис відповідає підстановці та ігнорується, за винятком того, aaa/cccщо повертається назад.


2
@iconoclast: Тоді ви, мабуть, робите щось інше. Опублікуйте ще одне запитання (з повною інформацією), якщо вам потрібна допомога.
Cascabel

Це теж не спрацювало для мене: / apps / *! / Apps / myApps / FluidTest / bin /
Jarrod Smith

5
@Jarrod Це працює; ви просто робите щось інше. Вам доведеться використовувати цей метод рекурсивно, саме з причин, наведених у відповіді. ! apps / myApps, apps / myApps / * тощо.
Cascabel

Ах, вибачте, я зараз розумію. Але ТО не дозволить мені знову проголосувати.
Джаррод Сміт,

Цікаво, чому це не працює для aaa / ** / *! Aaa / ccc / eee (ігнорувати все, крім файлів на певному шляху)
Пхонг Нгуен

21

Якщо ви хочете виключити все aaa, але включити aaa/cccі все, що знаходиться під ним, вам слід використовувати:

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

Перший рядок говорить git ігнорувати все, що знаходиться внизу aaa, другий - не ігнорувати папку, aaa/cccяка насправді "дозволяє" третій рядок, а потім повідомляє, що не ігнорує все, що знаходиться внизу aaa/ccc.


1
Третій рядок для мене не мав різниці.
Джеймс Хопкін,

3
Щоб мати можливість включити все в будь-який підкаталог aaa/cccбудь-якого рівня, для мене працювало те, що було !aaa/ccc/**замість!aaa/ccc/*
boclodoa

3

Якщо хтось все ще не бачить нещодавно неігноровані елементи в git statusзапущеній git update-indexруці раніше, може допомогти git побачити зміни (принаймні у версії 1.9.x gitbash).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.