Сделать .gitignore игнорировать все, кроме нескольких файлов
Я понимаю, что файл .gitignore хранит указанные файлы из Git версии
контроль. У меня есть проект (LaTeX), который генерирует много дополнительных файлов (.auth,
.dvi,.pdf, журналы и т.д.), но я не хочу, чтобы они отслеживались.
Я знаю, что мог (возможно, должен) сделать так, чтобы все эти файлы были помещены в
отдельную подпапку в проекте, так как я мог бы просто игнорировать папку.
Однако существует ли возможный способ сохранить выходные файлы в корне
дерево проекта и используйте .gitignore, чтобы игнорировать все, кроме файлов, которые я
отслеживание с помощью Git? Что-то вроде
# Ignore everything
*
# But not these files...
script.pl
template.latex
# etc...
Ответы
Ответ 1
Дополнительный префикс !
, который отрицает шаблон; любой сопоставимый файл, исключенный предыдущий шаблон снова будет включен. Если совпадающий шаблон совпадает, это приведет к переопределению источников с более низким приоритетом.
# 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/*
Ответ 2
Если вы хотите игнорировать весь контент каталога, кроме одного файла внутри него, вы можете написать пару правил для каждого каталога в пути к файлу.
Например, .gitignore игнорировать папку pippo, за исключением pippo/pluto/paperino.xml
.gitignore
pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml
Ответ 3
Вы хотите использовать /*
вместо *
или */
в большинстве случаев
Использование *
допустимо, но работает рекурсивно. Это не будет смотреть на каталоги с тех пор. Люди рекомендуют снова использовать !*/
Для добавления в белый список каталогов, но на самом деле лучше занести в черный список папку самого высокого уровня с помощью /*
# 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
Ответ 4
Немного более конкретно:
Пример: Игнорировать все в webroot/cache
- но сохранить webroot/cache/.htaccess
.
Обратите внимание на слэш (/) после папки cache
:
FAILS
webroot/cache*
!webroot/cache/.htaccess
WORKS
webroot/cache/*
!webroot/cache/.htaccess
Ответ 5
# ignore these
*
# except foo
!foo
Ответ 6
Чтобы игнорировать некоторые файлы в каталоге, вы должны сделать это в правильном порядке:
Например, игнорировать все в папке "приложение", кроме index.php, и папка "config" обратить внимание на порядок.
Сначала вы должны отказаться, хотите, чтобы вы захотели.
FAILS
application/*
!application/config/*
!application/index.php
WORKS
!application/config/*
!application/index.php
application/*
Ответ 7
Вы можете использовать git config status.showUntrackedFiles no
, и все незатребованные файлы будут скрыты от вас. Подробнее см. man git-config
.
Ответ 8
Чтобы исключить папку из .gitignore, можно выполнить следующее.
!app/
app/*
!app/bower_components/
app/bower_components/*
!app/bower_components/highcharts/
Это игнорирует все файлы/подпапки внутри bower_components
, за исключением /highcharts
.
Ответ 9
Есть несколько подобных вопросов по этому поводу, поэтому я опубликую то, что я написал раньше:
Единственный способ заставить меня работать на моей машине - это сделать так:
# 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 здесь: fooobar.com/questions/11138/...
Это были полезные темы:
Я также пробовал
*
*/*
**/**
и **/wp-content/themes/**
или /wp-content/themes/**/*
Ничто из этого не сработало для меня. Много следов и ошибок!
Ответ 10
У меня была проблема с подпапкой.
Не работает:
/custom/*
!/custom/config/foo.yml.dist
Работает:
/custom/config/*
!/custom/config/foo.yml.dist
Ответ 11
Что для меня работало, я хотел зафиксировать только один плагин Cordova для репо:
...
plugins/*
!plugins/cordova-plugin-app-customization
Ответ 12
У меня есть 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
Надеюсь, что кто-то найдет это полезным.
Ответ 13
Я знаю, что опаздываю на вечеринку, но здесь мой ответ.
Как сказал @Joakim, чтобы игнорировать файл, вы можете использовать что-то вроде ниже.
# Ignore everything
*
# But not these files...
!.gitignore
!someFile.txt
но если файл находится во вложенных каталогах, то немного сложно написать правила вручную.
Например, если мы хотим пропустить все файлы в git
проекте, но не a.txt
который находится в aDir/anotherDir/someOtherDir/aDir/bDir/cDir
. Тогда наш .gitignore
будет примерно таким
# Skip all files
*
# But not 'aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt'
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt
Приведенный выше файл .gitignore
пропустит все каталоги и файлы, кроме !aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt
Как вы могли заметить, эти правила сложно определить.
Чтобы решить эту проблему, я создал простое консольное приложение с именем git-do-not-ignore, которое сгенерирует правила для вас. Я разместил проект в github с подробной инструкцией.
Пример использования
java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"
Выход
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt
Там также простая веб-версия доступна здесь
Спасибо.
Ответ 14
Я перепробовал все ответы, приведенные выше, но у меня не получилось. Прочитав документацию 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/
Иначе это не будет работать, как ожидалось.
Ответ 15
Пока у меня ничего не получалось, потому что я пытался добавить одну банку из lib.
Это не сработало:
build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar
Это сработало:
build/*
!build/libs
Ответ 16
Простое решение, если вам нужно игнорировать все, кроме нескольких файлов и нескольких корневых папок:
/*
!.gitignore
!showMe.txt
!my_visible_dir
Магия находится в /*
(как описано выше), она игнорирует все в (корневой) папке, но НЕ рекурсивно.
Ответ 17
У меня также были некоторые проблемы с отрицанием отдельных файлов. Я смог их зафиксировать, но моя 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.
Отличная тема! Эта проблема беспокоила меня некоторое время;)
Ответ 18
Я получил это работает
# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib
Ответ 19
Кажется, я нашел то, что сработало для меня, о чем никто не упомянул.
# Ignore everything
*
# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...
# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*
По сути, это, кажется, сводит на нет игнорирование подкаталога, вам нужно иметь две записи, одну для самого подкаталога !subdir/
а затем еще одну, которая распространяется на все файлы и папки в нем !subdir/**/*
Ответ 20
Вот как я это сделал:
# Ignore everything
*
# Whitelist anything that a directory
!*/
# Whitelist some files
!.gitignore
# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**
# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules
# Ignore this file recursively
**/.DS_Store
Используйте gig status -u
для рекурсивного просмотра отдельных файлов в неотслеживаемых каталогах - в git status
вы будете видеть только папки, что может заставить вас думать, что все внутри них отслежено
Ответ 21
Гораздо более простое решение, чем что - либо предлагаемое здесь раньше:
Собственно, единственное простое решение:
Установите ваш файл .gitignore
на это:
# Copy/paste these two lines
/**/*
!/**/*/
# Then plainly add the files you want to exclude from gitignore, each preceded by an exclamation mark
!/.gitignore
!/goo/zoo/boo/far.txt
!/bower_components/mdi/css/materialdesignicons.css
Пожалуйста, проголосуйте! : D