Я понимаю, что файл .gitignore хранит указанные файлы из Git версии контроль. У меня есть проект (LaTeX), который генерирует много дополнительных файлов (.auth, .dvi,.pdf, журналы и т.д.), но я не хочу, чтобы они отслеживались.
Я знаю, что мог (возможно, должен) сделать так, чтобы все эти файлы были помещены в отдельную подпапку в проекте, так как я мог бы просто игнорировать папку.
Однако существует ли возможный способ сохранить выходные файлы в корне дерево проекта и используйте .gitignore, чтобы игнорировать все, кроме файлов, которые я отслеживание с помощью Git? Что-то вроде
# Ignore everything
*
# But not these files...
script.pl
template.latex
# etc...
Дополнительный префикс
!
, который отрицает шаблон; любой сопоставимый файл, исключенный предыдущий шаблон снова будет включен. Если совпадающий шаблон совпадает, это приведет к переопределению источников с более низким приоритетом.
# Ignore everything
*
# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...
# ...even if they are in subdirectories
!*/
# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*
Если вы хотите игнорировать весь контент каталога, кроме одного файла внутри него, вы можете написать пару правил для каждого каталога в пути к файлу. Например, .gitignore игнорировать папку pippo, за исключением pippo/pluto/paperino.xml
pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml
foo
и foo/*
- это не одно и то же. Чтобы это работало, вам нужно использовать foo/*
для базовой папки
Вы хотите использовать /*
вместо *
или */
в большинстве случаев
Использование *
допустимо, но работает рекурсивно. Это не будет смотреть на каталоги с тех пор. Люди рекомендуют снова использовать !*/
Для добавления в белый список каталогов, но на самом деле лучше занести в черный список папку самого высокого уровня с помощью /*
# Blacklist files/folders in same directory as the .gitignore file
/*
# Whitelist some files
!.gitignore
!README.md
# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log
# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt
# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder
Приведенный выше код будет игнорировать все файлы, за исключением .gitignore
, README.md
, folder/a/file.txt
, folder/a/b1/
и folder/a/b2/
и всего, что содержится в этих двух последних папках. (И .DS_Store
и *.log
будут игнорироваться в этих папках.)
Очевидно, я мог бы сделать, например !/folder
!/.gitignore
или !/.gitignore
тоже.
Более подробная информация: http://git-scm.com/docs/gitignore
.DS_Store
файлы .DS_Store
не игнорируются, но через командную строку это не проблема. Чтобы обойти это, мне пришлось переместить **/.DS_Store
ниже всех других правил.
Немного более конкретно:
Пример: Игнорировать все в webroot/cache
- но сохранить webroot/cache/.htaccess
.
Обратите внимание на слэш (/) после папки cache
:
FAILS
webroot/cache*
!webroot/cache/.htaccess
WORKS
webroot/cache/*
!webroot/cache/.htaccess
# ignore these
*
# except foo
!foo
Чтобы игнорировать некоторые файлы в каталоге, вы должны сделать это в правильном порядке:
Например, игнорировать все в папке "приложение", кроме index.php, и папка "config" обратить внимание на порядок.
Сначала вы должны отказаться, хотите, чтобы вы захотели.
FAILS
application/*
!application/config/*
!application/index.php
WORKS
!application/config/*
!application/index.php
application/*
Вы можете использовать git config status.showUntrackedFiles no
, и все незатребованные файлы будут скрыты от вас. Подробнее см. man git-config
.
Чтобы исключить папку из .gitignore, можно выполнить следующее.
!app/
app/*
!app/bower_components/
app/bower_components/*
!app/bower_components/highcharts/
Это игнорирует все файлы/подпапки внутри bower_components
, за исключением /highcharts
.
Есть несколько подобных вопросов по этому поводу, поэтому я опубликую то, что я написал раньше:
Единственный способ заставить меня работать на моей машине - это сделать так:
# Ignore all directories, and all sub-directories, and it contents:
*/*
#Now ignore all files in the current directory
#(This fails to ignore files without a ".", for example
#'file.txt' works, but
#'file' doesn't):
*.*
#Only Include these specific directories and subdirectories and files if you wish:
!wordpress/somefile.jpg
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*
Обратите внимание, что вы должны явно разрешать контент для каждого уровня, который хотите включить. Так что, если у меня есть поддиректории 5 в глубине под темами, мне все равно нужно написать это.
Это комментарий от @Yarin здесь: https://stackoverflow.com/questions/5241644/using-gitignore-to-ignore-everything-but-specific-directories
Это были полезные темы:
Я также пробовал
*
*/*
**/**
и **/wp-content/themes/**
или /wp-content/themes/**/*
Ничто из этого не сработало для меня. Много следов и ошибок!
У меня была проблема с подпапкой.
Не работает:
/custom/*
!/custom/config/foo.yml.dist
Работает:
/custom/config/*
!/custom/config/foo.yml.dist
Что для меня работало, я хотел зафиксировать только один плагин Cordova для репо:
...
plugins/*
!plugins/cordova-plugin-app-customization
У меня есть JQuery и Angular от беседки. Бауэр установил их в
/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files
Минимизированный jquery находится внутри каталога dist
, а Angular находится внутри каталога angular
. Мне нужно было только минимизировать файлы, которые будут переданы в github. Некоторые подделывают .gitignore, и это то, что мне удалось вызвать...
/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js
Надеюсь, что кто-то найдет это полезным.
Я перепробовал все ответы, приведенные выше, но у меня не получилось. Прочитав документацию gitignore (здесь), я обнаружил, что если вы сначала исключите папку, то имена файлов в подпапке не будут проиндексированы. Поэтому, если впоследствии вы используете восклицательный знак для включения файла, он не будет найден в индексе и, следовательно, не будет включен в ваш git-клиент.
Это был способ найти решение. Я начал с добавления исключений для всех подпапок в моем дереве папок, чтобы оно заработало, что является адской работой. После этого я смог сжать подробную конфигурацию до конфигурации ниже, что немного противоречит документации.
Рабочая .gitignore:
# Ignore the 'Pro' folder, except for the '3rdparty' subfolder
/Pro/*
!Pro/3rdparty/
# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/
# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/
В результате я вижу в своем git-клиенте, что только два файла в папке Pro/3rdparty/domain/modulename/готовятся к следующему коммиту, и это именно то, что я искал.
И если вам нужно внести в белый список несколько подпапок одной и той же папки, сгруппируйте строки восклицательного знака под оператором exclude следующим образом:
# Ignore the 'Pro' folder, except for the '3rdparty' subfolder
/Pro/*
!Pro/3rdparty/
# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/
# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/
# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/
Иначе это не будет работать, как ожидалось.
У меня также были некоторые проблемы с отрицанием отдельных файлов. Я смог их зафиксировать, но моя IDE (IntelliJ) всегда жаловалась на игнорируемые файлы, которые отслеживаются.
git ls-files -i --exclude-from .gitignore
Отображены два файла, которые я исключил таким образом:
public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php
В конце концов, это сработало для меня:
public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php
Ключом было отрицание папки typo3conf/
first.
Кроме того, похоже, что порядок утверждений не имеет значения. Вместо этого вам нужно явно отменить все подпапки, прежде чем вы сможете отменить отдельные файлы в нем.
Папка !public/typo3conf/
и содержимое папки public/typo3conf/*
- это две разные вещи для .gitignore.
Отличная тема! Эта проблема беспокоила меня некоторое время;)
Пока у меня ничего не получалось, потому что я пытался добавить одну банку из lib.
Это не сработало:
build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar
Это сработало:
build/*
!build/libs
Я получил это работает
# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib
Простое решение, если вам нужно игнорировать все, кроме нескольких файлов и нескольких корневых папок:
/*
!.gitignore
!showMe.txt
!my_visible_dir
Магия находится в /*
(как описано выше), она игнорирует все в (корневой) папке, но НЕ рекурсивно.