.gitignore белый список каталога и его содержимое

Я пытаюсь белый список каталога (и его содержимое) SupplierName в моем каталоге поставщика Zend Framework 2.

оригинала .файл gitignore в / vendor выглядит так:

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*

теперь я хотел бы белый список каталога SupplierName, который не должен быть слишком сложным, я думал. У меня прочитайте документы на gitignore и попробовал следующие конфигурации:

сначала попробуй добавить !SupplierName сразу после комментарий, в котором говорится, что я должен добавить путь в белый список здесь.

# Add here the vendor path to be whitelisted
!SupplierName
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*

сразу после этого я выполнил git status который не показывал каталог поставщика/SupplierName. git add vendor/SupplierName показала следующее сообщение:

следующие пути игнорируются одним из ваших .файлы gitignore: vendor/SupplierName

вторая попытка

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!SupplierName
!.gitignore
*

сразу после этого я выполнил git status не показывать каталог поставщиков/SupplierName. git add vendor/SupplierName показала следующее сообщение:

следующие пути игнорируются одним из ваших .файлы gitignore: vendor/SupplierName

третья попытка

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*
!SupplierName

сразу после этого я выполнил git status который не показывал каталог поставщика/SupplierName. git add vendor/SupplierName кажется, что работает. Но теперь, когда я хочу добавить модуль.файл php (и некоторые другие файлы, подкаталоги и т. д.) происходит следующее. git add vendor/SupplierName/Module.php -->

следующие пути игнорируются одним из ваших .файлы gitignore: поставщик / имя поставщика / модуль.в PHP

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
*
!.gitignore
!SupplierName
!SupplierName/
!SupplierName/*

позволяет мне добавлять файлы непосредственно в vendor / SupplierName, но git add vendor/SupplierName/config/module.config.php по-прежнему

следующие пути игнорируются одним из ваших .файлы gitignore: vendor/SupplierName/config / module.конфиг.в PHP

Я искал проблемы что касается рекурсивного белого списка, потому что это кажется проблемой, но ничего не произошло.

5 ответов


вы можете использовать 2 .gitignore файлы для достижения желаемого результата:

# vendor/.gitignore
*
!.gitignore
!SupplierName/
!SupplierName/*

# vendor/SupplierName/.gitignore
!*

Я проверил это с помощью тестового РЕПО и, похоже, работает для меня в добавлении файлов на столько уровней глубоко под .

$ git add .

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   vendor/.gitignore
#   new file:   vendor/SupplierName/.gitignore
#   new file:   vendor/SupplierName/a
#   new file:   vendor/SupplierName/b
#   new file:   vendor/SupplierName/c
#   new file:   vendor/SupplierName/d
#   new file:   vendor/SupplierName/dir1/d
#   new file:   vendor/SupplierName/dir1/dir4/dir5/dir6/dir7/dir8/dir9/dir10/somefile
#   new file:   vendor/SupplierName/dir1/dir4/f1
#   new file:   vendor/SupplierName/dir1/dir4/f2
#   new file:   vendor/SupplierName/dir1/dir4/f3
#   new file:   vendor/SupplierName/dir1/dir4/f4
#   new file:   vendor/SupplierName/dir1/e
#   new file:   vendor/SupplierName/dir1/f
#   new file:   vendor/SupplierName/dir3/dir6/f5
#   new file:   vendor/SupplierName/dir3/dir6/f6
#   new file:   vendor/SupplierName/dir3/dir6/f7
#   new file:   vendor/SupplierName/dir3/dir7/f8
#   new file:   vendor/SupplierName/e
#

вы также можете достичь этого только с одним .gitignore файл (в корне проекта):

/*
!/.gitignore
!/vendor
/vendor/*
!/vendor/SupplierName

нашел интересную статью:https://jasonstitt.com/gitignore-whitelisting-patterns

все кредиты на Джейсон Ститт. Тексты копируются с сайта выше:

игнорировать все, а затем добавить конкретные поддеревья

# Ignore everything
*
# But descend into directories
!*/
# Recursively allow files under subtree
!/subtree/**
# You can be specific with these rules
!/some/other/deep/path/**
!.gitignore 

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

если вы не используете !*/, вам понадобятся дополнительные правила для un-ignore /поддерево/ и его дочерние каталоги.

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

игнорировать корневой каталог, а затем добавить целые поддеревья

# Ignore everything in the root
/*
# Un-ignore all of subtree
!/subtree/
!.gitignore 

этот шаблон несколько грубее, чем предыдущий. The /* правило будет игнорировать только элементы в корне РЕПО структура каталогов, так что как только вы белый список каталога, все содержимое каталога также будет разрешено, даже без использования the * или ** шаблоны.

игнорировать все в Каталоге, но сохранить пустой каталог

*
!.gitignore

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


У меня была аналогичная проблема при переходе с CVS на Git.

В отличие от CVS, Git не смотрит на каталоги, он фокусируется на файлах.

например, вы не можете не-игнорировать каталог "a", но вы не можете-игнорировать все файлы в каталоге "a", например: !а/*

то же самое верно для поддиректорий.

Если каталог " a "имеет подкаталог" b", и вы игнорируете"!a/*" тогда вы все равно получите все файлы в "a / b".

поэтому вам придется игнорировать это тоже"!a/ b / *" и так далее для всех подкаталогов, которые вы хотите белый список.

вам нужен только один .файла.gitignore

таким образом, вы получаете что-то вроде:

# ignore everything
*
# except for .gitignore files in the current directory
!.gitignore
# and all files in directory a
!a/*
#and all files in subdirectory b
!a/b/*

С этим вы все равно получите файлы из a/c и a/b / c. Я не уверен, что существует обходной путь для рекурсии вниз подкаталогов.


вы должны сначала включить все в черный список, а затем сделать каждый каталог и окружность в белом списке. Например, я только хочу поставить DIR /opt/source/ реж /opt/nginx/ и файл /home/test/.opt/hello.txt в белом списке, может написать как это, чтобы заставить его работать:

/*
!/.gitignore
!/opt
/opt/*
!/opt/source/
!/opt/nginx/
!/home
/home/*
!/home/test
/home/test/*
!/home/test/.opt
/home/test/.opt/*
!/home/test/.opt/hello.txt