Несколько `.gitignore`s хмурится?

239

Если бы репо не состояло из нескольких независимых проектов, то было бы проще всего иметь один .gitignoreфайл в корне репо, чем различные. Существует ли стандартная лучшая практика для этого или некоторого онлайн-анализа, когда один подход лучше, чем другой?

Конли Оуэнс
источник

Ответы:

254

Я могу вспомнить как минимум две ситуации, когда вы хотите иметь несколько .gitignoreфайлов в разных (под) каталогах.

  • Различные каталоги имеют разные типы файлов для игнорирования. Например, .gitignoreв верхнем каталоге вашего проекта игнорируются сгенерированные программы, а Documentation/.gitignoreигнорируется сгенерированная документация.

  • Игнорировать данные файлы только в данной (под) директории (вы можете использовать /sub/fooв .gitignore, хотя).

Помните, что шаблоны в .gitignoreфайле рекурсивно применяются к (под) каталогу, в котором находится файл, и ко всем его подкаталогам, если шаблон не содержит '/' (например, шаблон nameприменяется к любому файлу с именем nameв данном каталоге и ко всем его подкаталогам, в то время как /nameк файлу с этим именем только в данном каталоге).

Якуб Наребски
источник
1
Ах, я почему-то думал, что /Documentation/*.html охватит это, но я думаю, что подстановочный знак * будет соответствовать каталогам только на одном уровне.
Конли Оуэнс
9
@ConleyOwens: с современным Git вы можете использовать Documentation/**/*.html(обратите внимание, что любая косая черта привязывает шаблон; /fooона используется для привязки файла непосредственно в каталоге)
Якуб Наренбский
97

В качестве тангенциального примечания, один случай, когда возможность иметь несколько .gitignoreфайлов очень полезна, - это если вам нужен дополнительный каталог в вашей рабочей копии, который вы никогда не намереваетесь зафиксировать. Просто поместите 1-байт .gitignore(содержащий только одну звездочку) в этот каталог, и он никогда не будет отображаться в git statusи т. Д.

Аристотель Пагальцис
источник
4
для этого вы также можете использовать файл «.git / info / exclude»
Ayell
10
Конечно, если вы не возражаете против необходимости открывать файл в месте где-то вне корня хранилища, затем записывать в него целый путь, а затем не забывать очищать запись, если / когда вы удаляете каталог. Сравните это с printf \* > .gitignore(очистка происходит автоматически при удалении каталога). Я уверен, что есть ситуации, когда .git/info/excludeболее подходящий выбор, но не так много.
Аристотель Пагальцис
Да, если вы хотите исключить файл вместо папки, например: p
Ayell
4
Я сказал «если вам нужен дополнительный каталог в вашей рабочей копии, который вы никогда не намереваетесь зафиксировать» в моем ответе.
Аристотель Пагальцис
1
Так как он создает меньше беспорядка в корне .gitignore, мне очень нравится этот подход.
Дэвид А. Грей,
59

Вы можете иметь несколько .gitignore, каждый из которых, конечно, в своем собственном каталоге.
Чтобы проверить , какая gitignore правило отвечает за игнорирование файлов, использование git check-ignore: git check-ignore -v -- afile.

И у вас может быть другая версия .gitignoreфайла для каждой ветви: я уже видел такую ​​конфигурацию для обеспечения того, чтобы одна ветвь игнорировала файл, а другая - нет: посмотрите этот вопрос, например .

Если ваше репо включает в себя несколько независимых проектов, было бы лучше упомянуть их как подмодули .
Это было бы реальным передовым опытом, позволяющим клонировать каждый из этих проектов независимо (со своими соответствующими .gitignoreфайлами), в то время как на него ссылалась конкретная ревизия в глобальном родительском проекте.
Смотрите истинную природу подмодулей для получения дополнительной информации.


Обратите внимание, что начиная с git 1.8.2 (март 2013 г.) вы можете сделать a git check-ignore -v -- yourfile, чтобы увидеть, какой запуск gitignore (из какого .gitignoreфайла) применяется к ' yourfile', и лучше понять, почему указанный файл игнорируется.
Смотрите " какое gitignoreправило игнорирует мой файл? "

VonC
источник
17

Про сингл

  • Легко найти.

  • Выследить правила исключения может быть довольно сложно, если у меня есть несколько gitignore, на нескольких уровнях в репо.

  • С несколькими файлами вы также обычно получаете много дублирования.

Pro несколько

  • Области "знания" к той части дерева файлов, где это необходимо.

  • Поскольку Git отслеживает только файлы, пустой .gitignore - единственный способ зафиксировать «пустой» каталог.

    (И до Git 1.8 единственным способом исключить шаблон, как my/**.exampleбыло, было создание my/.gitignoreс шаблоном **.foo. Эта причина теперь не применима, как вы можете /my/**/*.example.)


Я предпочитаю один файл, где я могу найти все исключения. Я никогда не пропускал каталоги .svn, и я не буду пропускать каталоги .gitignore.

Тем не менее, несколько gitignores довольно распространены. Если вы используете их, по крайней мере, будьте последовательны в их использовании, чтобы сделать их разумными для работы. Например, вы можете поместить их в каталоги только одного уровня от корня.

Пол Дрэйпер
источник
«Пустой .gitignore - единственный способ зафиксировать« пустой »каталог». На самом деле, я считаю, что загрузка одного файла README (или файла с таким названием empty) является более распространенным явлением.
23 марта
6
.gitkeep - это тоже хороший способ сделать это ... просто еще одно соглашение. Мне нравится идея использования файла readme, потому что тогда вы можете объяснить, для чего используется каталог, в этом файле read me.
Гэвин Пикин
8

Есть много ситуаций , где вы хотите , чтобы совершить каталог в Git репо , но без файлов в нем, например , в logs, cache, uploadsкаталогах и т.д.

Поэтому я всегда добавляю .gitignoreв эти каталоги файл со следующим содержимым:

*
!.gitignore

С этим .gitignoreфайлом Git не будет отслеживать файлы в этих каталогах, но все же позволит мне добавить .gitignoreфайл и, следовательно, сам каталог в репозиторий.

Лукман
источник