.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