Білий список та підкаталоги у Git


91

Я створив білий список лише для текстових файлів.

*
!*.txt

Тепер у мене є невідстежений текстовий файл у підкаталозі - sub/dir/file.txt, і це НЕ відображається (він ігнорується). Проте відображаються текстові файли в кореневому каталозі.

Чому це і як це виправити?



Файли, які ви хочете включити в підкаталог? Якщо так, цей підкаталог може бути проігнорований першою зіркою у вашому .gitignore.
фаджран

Так. Ці файли будуть настільки низькими в структурі каталогів, як папка 11.1.102.55 у моєму прикладі. Вкладання не завжди однакове між папками / продуктами.
Нейт

1
Я знаю про цю функціональність. У нас сотні каталогів. Швидше було б просто явно ігнорувати типи файлів, які ми не хочемо, ніж зробити один gitignore для кожного каталогу. Я справді шукаю спосіб вивести функціональні можливості білого списку з файлу .gitignore.
Нейт

1
Я не бачу, як це дублікат. Інше питання задає питання, як додати до білого списку певні файли, тоді як це запитання, як додати до білого списку певні типи файлів, включаючи підтеки. Насправді це більше схоже на копію stackoverflow.com/questions/8024924/… .
Big McLargeHuge

Відповіді:


146

Якщо ви спробуєте це таким чином, це не вдасться, оскільки в підсумку ви потрапите в чорний список каталогів у вашій структурі.

Для вирішення ви хочете внести до чорного списку все, що не є каталогом і не є одним із типів файлів, які ви хочете зафіксувати, не ввівши до чорного списку каталоги .

.gitignoreФайл , який буде робити це:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Перевірив це в трирівневій структурі білого списку для .txtфайлів у присутності *.one, *.twoа *.threeфайли, що використовуються .gitignoreв кореневому каталозі сховища, працюють для мене. Вам не доведеться додавати .gitignoreфайли у всі каталоги у вашій структурі.

Інформація, яку я використовував для з’ясування відповіді, серед іншого, надходила з цього (stackoverflow.com).


18
Вам також потрібен запис !.gitignore, коли ви використовуєте *, чи не так?
sjas

2
Подивіться мою відповідь тут: stackoverflow.com/questions/987142/... Може бути кориснішим використовувати /*чорний список лише папки верхнього рівня, але не всіх папок рекурсивно, що насправді означає, що .gitignoreне слід заглядати в підпапки папки білого списку.
Райан Тейлор,

1

Більш простим способом досягнення цього є:

# Blacklist all files...
*.*

# ...except the ones we want
!*.txt

Це працює, оскільки gitignoreзастосовує шаблони, які починаються не з /усіх рівнів під .gitignoreфайлом:

Якщо на початку або в середині (або обох) шаблону є роздільник, то шаблон відносно рівня каталогу конкретного файлу .gitignore. В іншому випадку шаблон може також збігатися на будь-якому рівні нижче рівня .gitignore.

Якщо ви хочете зробити це для файлів у каталозі , все стає складнішим:

# Blacklist all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Це працює, оскільки gitignoreє спеціальні правила для **:

Дві послідовні зірочки (" **") у шаблонах, що відповідають повній імені шляху, можуть мати особливе значення:

  • Коса риса, за якою слідують дві послідовні зірочки, потім коса риса відповідає нулю або більше каталогів. Наприклад, " a/**/b" збігається " a/b", " a/x/b", " a/x/y/b" тощо.

Ключовим елементом є переконатися, що ви не ігноруєте каталоги, оскільки тоді кожен файл у цьому каталозі ігнорується незалежно від інших правил.


0

Я довго шукав:

  1. Припустимо, у мене велика структура папок з ~ 100 000 каталогів, рекурсивно вкладених. У цих папках знаходиться близько 30 000 файлів типу .txt(у моєму випадку: type *.md). Поруч із цими *.mdфайлами є, скажімо, 500 ГБ (мільйон +) файлів, які я не хочу відстежувати.

  2. Я хочу, щоб git відстежував лише .txt(або *.md) файли у всіх папках та підкаталогах.

Правильна відповідь повинна бути такою: у Git це неможливо.

Що я зробив замість цього:

[редагувати: також не спрацювало - я намагався створити папку із символічними посиланнями (або жорсткими посиланнями) і використовувати там git, але git не слідкує за символічними посиланнями і замінює жорсткі посилання. Дох!]

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