Заставьте .gitignore игнорировать все, кроме нескольких файлов - PullRequest
1393 голосов
/ 12 июня 2009

Я понимаю, что файл .gitignore скрывает указанные файлы из версии Git контроль. У меня есть проект (LaTeX), который генерирует много дополнительных файлов (.auth, .dvi, .pdf, журналы и т. д.), но я не хочу, чтобы они отслеживались.

Я знаю, что могу (возможно, должен) сделать так, чтобы все эти файлы были помещены в отдельная подпапка в проекте, так как я мог тогда просто игнорировать папку.

Однако есть ли способ сохранить выходные файлы в корне дерево проекта и использовать .gitignore, чтобы игнорировать все, кроме файлов, которые я отслеживание с Git? Что-то вроде

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

Ответы [ 20 ]

2005 голосов
/ 12 июня 2009

Необязательный префикс !, который отменяет шаблон; любой соответствующий файл исключен предыдущий шаблон снова будет включен. Если отрицательный шаблон соответствует, это переопределит источники шаблонов с более низким приоритетом.

# 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/*
549 голосов
/ 01 мая 2013

Если вы хотите игнорировать все содержимое каталога, кроме одного файла внутри него, вы можете написать пару правил для каждого каталога в пути к файлу. Например .gitignore, чтобы игнорировать папку pippo, кроме как в pippo / pluto / paperino.xml

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml
196 голосов
/ 29 апреля 2015

Вы хотите использовать /* вместо * или */ в большинстве случаев

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

# 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 тоже.

Дополнительная информация: http://git -scm.com / docs / gitignore

68 голосов
/ 13 августа 2013

Чуть конкретнее:

Пример: игнорировать все в webroot/cache - но сохранить webroot/cache/.htaccess.

Обратите внимание на косую черту (/) после папки cache:

FAILS

webroot/cache*
!webroot/cache/.htaccess

РАБОТЫ

webroot/cache/*
!webroot/cache/.htaccess
53 голосов
/ 12 июня 2009
# ignore these
*
# except foo
!foo
26 голосов
/ 09 августа 2012

Чтобы игнорировать некоторые файлы в каталоге, вы должны сделать это в правильном порядке :

Например, игнорируйте все в папке «application», кроме index.php и папки «config» , обратите внимание на порядок .

Вы должны отрицать, что хотите сначала.

FAILS

application/*

!application/config/*

!application/index.php

РАБОТЫ

!application/config/*

!application/index.php

application/*

19 голосов
/ 12 июня 2009

Вы можете использовать git config status.showUntrackedFiles no, и все неотслеживаемые файлы будут скрыты от вас. Подробнее см. man git-config.

14 голосов
/ 10 ноября 2016

Чтобы исключить папку из .gitignore, можно сделать следующее.

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

При этом будут игнорироваться все файлы / подпапки внутри bower_components, кроме /highcharts.

13 голосов
/ 30 апреля 2015

По этому поводу есть куча похожих вопросов, поэтому я выложу то, что написал ранее:

Единственный способ заставить это работать на моей машине - это сделать так:

# Ignore all directories, and all sub-directories, and it's 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 глубоко под темами, мне все еще нужно разобрать это.

Это из комментария @ Ярина здесь: https://stackoverflow.com/a/5250314/1696153

Это были полезные темы:

я тоже пробовал

*
*/*
**/**

и **/wp-content/themes/**

или /wp-content/themes/**/*

Ничего из этого не сработало и для меня. Много следов и ошибок!

9 голосов
/ 06 июня 2018

У меня была проблема с подпапкой.

Не работает:

/custom/*
!/custom/config/foo.yml.dist

Работает:

/custom/config/*
!/custom/config/foo.yml.dist
...