Можно ли игнорировать правила .gitignore в подкаталоге?

83

Я хочу игнорировать все правила .gitignore в подкаталоге, кроме правил .gitignore в корне.

например) у меня уже есть .gitignoreфайл в структуре каталогов /a.

А также .gitignoreфайл в формате /a/b. Допустим, /aесть a.txt b.txtфайлы.

/a/bесть .configфайл. .gitignoreопределяет .configв /a/b.

.configфайл будет проигнорирован .gitignoreв /a/b.

Но я действительно хочу отслеживать .configфайл, игнорируя правила .gitignoreв подкаталоге.

Является ли это возможным?

заранее спасибо

Чон
источник

Ответы:

135

Ваш вопрос не слишком ясен, но если есть несколько подкаталогов, в которых вам нужны разные правила gitignore, вы можете просто создать новый .gitignore в этом каталоге.

Скажем, у вас есть:

проект / .gitignore
проект / материал / .gitignore

.Gitignore в файле stuff / переопределит .gitignore в корневом каталоге.

git help gitignoreили man gitignoreимеет немного больше информации о том, что возможно.

Signine
источник
2
Я думаю , что ОП прошу , если у вас есть структура каталогов /a/b/cи обновление .gitignoreв /a/b, возможно в /a/b/cигнорировать правила в /a/bи вместо того, чтобы использовать только правили с /a.
Майкл Миор,
45
Да, если это был вопрос, можно отменить правила в .gitignore дальше по цепочке. "An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again."
Signine
3
@signine Не работает с каталогами. Смотрите мой ответ .
Росс Паттерсон
2
Я думаю, правильнее будет сказать так: inner .gitignoreбудет сливаться outer .gitignoreс более высоким приоритетом, а не просто отменяться.
user218867
@eric wang очевидно подкаталог не объединяется, а переопределяется: git-scm.com/docs/gitignore
topspin
41

Допустим, вы хотите включить его node_modulesв свой репозиторий, но у некоторого последующего модуля есть .gitignoreсвой собственный. Вы можете отменить правила, добавив в корневой .gitignoreфайл следующее:

# Make sure to include everything in node_modules.
!node_modules/**
Ник Залуцкий
источник
3
Есть ли более общий способ сделать это? Допустим, у меня есть node_modules/mod1, node_modules/mod2внутри обоих есть .gitignore, который игнорирует более глубокое node_modulesвнутри них (например, node_modules/mod1/node_modulesя часто добавляю и удаляю модули, поэтому я не очень хорошо знаю и вручную добавляю правила для игнорирования node_modules/mod1/.gitignoreили добавления вручную !node_modules/mod1/node_modulesвсе время. В основном я пытаюсь развернуть приложение .gitignores
Meteor,
10

Ключ к проблеме здесь в том, что родительский каталог исключен. Откуда $ man gitignore:

Невозможно повторно включить файл, если родительский каталог этого файла исключен. Git не перечисляет исключенные каталоги по соображениям производительности, поэтому любые шаблоны для содержащихся файлов не действуют, независимо от того, где они определены.

Вот как я заставил это работать. Дано:

/a/...
/b/foo
/c/...

/.gitignore:

/*
!/b

Затем /b/fooбудут отображаться как включенные файлы, а все файлы /aи /cбудут исключены. Компромисс заключается в том, что вам нужно добавить отрицание для всех родителей любого каталога, в который вы хотите включить файлы.

Росс Паттерсон
источник
Почему бы не использовать !/b/**/*?
Алексис Тайлер
Не могу ответить без дополнительных объяснений от вас.
Росс Паттерсон
6

Насколько я знаю, это невозможно сделать. Поскольку локальный .gitignore перезапишет корневой ginignore, я добавляю вручную обходной путь.

git add --force [ your file and folder]
привет
источник
child .gitignoreне работал у меня, поскольку родитель переопределяет любые настройки дочерней папки. Если вы принудительно добавите, используя, git add -f myfile.txtон начнет отслеживать изменения в обход родительских .gitignoreнастроек.
SliverNinja - MSFT