чи можна ігнорувати правила .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
project / stuff / .gitignore

.Gitignore у матеріалі / замінить .gitignore у кореневому каталозі.

git help gitignoreабо man gitignoreмає трохи більше інформації про те, що можливо.


2
Я думаю , що ОП прошу , якщо у вас є структура каталогів /a/b/cі оновлення .gitignoreв /a/b, можливо в /a/b/cігнорувати правила в /a/bі замість того, щоб використовувати тільки правили з /a.
Michael Mior

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 07

@eric ван , по- видимому підкаталог не викачується, але перевизначає: 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унеможливлюють отримання всього цього в git.
gman,

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