Сделать .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