Правильно ігноруйте всі файли рекурсивно в певній папці, крім певного типу файлу


89

Я бачив подібні запитання ( 1 , 2 та 3 ), але я не отримую від них належного рішення.

Мені потрібно ігнорувати всі файли в певній папці, крім певного типу файлу. Папка є підкаталогом кореневого шляху. Дозвольте назвати папку Resources. Оскільки я не хочу ускладнювати ситуацію, дозвольте мені ігнорувати файли у всіх папках, Resourcesде вони знаходяться.

Це найпоширеніше рішення (у всіх повторюваних питаннях)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Проблема цього рішення полягає в тому, що воно зупиняє відстеження нещодавно доданих файлів (оскільки *ігнорує всі файли). Я не хочу продовжувати виключати кожен тип файлу. Я хочу нормальну поведінку, коли, якщо додається новий файл, це git statusпоказує.

Нарешті я отримав рішення тут . Рішення полягає в додаванні іншого .gitignoreфайлу в Resourcesпапку. Це працює правильно.

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

Це те, що я намагаюся досягти:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Але це дає протилежний результат. Він ігнорує *.fooтипи та відстежує інші файли.

Відповіді:


108

@SimonBuchan правильний.

З git 1.8.2, Resources/** !Resources/**/*.fooпрацює.


1
Це працює для мене, невелика настройка, мені просто потрібно видалити каталоги та все, що знаходиться під ними, так і зробив: DirectoryName1/** DirectoryName1/**/*для кожного з них. Перші видаляють каталоги, але вам потрібен другий, щоб видалити всі типи файлів.
Ентузіаст Скали

27

Найкраща відповідь - додати файл Resources / .gitignore у розділі Resources, що містить:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Якщо ви не бажаєте або не можете додати цей файл .gitignore, є неелегантне рішення:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

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


2
Це сумно .. Справді, у мене будуть глибші каталоги, тому я дотримуватимусь першого :(
nawfal

Детальніше про те саме рішення дивіться тут: stackoverflow.com/questions/7803689/… - також посилається вище OP @nawfal
тут

7

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


5
Якщо хтось стикається з цим конкретним випадком використання, ви можете використати git rm --cached <path to files>для очищення цих ігнорованих файлів з git, залишаючи їх у файловій системі.
lethluvchunk

5

Або я роблю це неправильно, або прийнята відповідь більше не працює з поточним git.

Я насправді знайшов правильне рішення і розмістив його під майже тим самим питанням тут . Для більш детальної інформації зверніться туди.

Рішення:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

2
Так, це працює для мене. Додавання ключа !/Resources/**/було вирішальним, щоб git не ігнорував підкаталоги.
Джонстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.