Заставьте .gitignore игнорировать все, кроме нескольких файлов

1240

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

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

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

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...
  • 12
    Дубликат stackoverflow.com/q/9162919/321973 (я знаю, что это новее, но ответ там более правильный). На самом деле этот ответ , вероятно, лучший
Теги:
gitignore

17 ответов

1875
Лучший ответ

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

# 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/*
  • 9
    Похоже, это также «игнорирует» подпапки, так что любые файлы с именем «script.pl» в любом другом месте, кроме корневого каталога, в любом случае не будут найдены. Я использую это сейчас (с * .pl), и все файлы * .pl игнорируются, хотя их много в подкаталогах ниже файла .gitignore
  • 36
    @PandaWood Эта проблема была поднята здесь (stackoverflow.com). Это вызвано тем, что первое выражение соответствует всем, включая каталоги, которые вы никогда не отрицаете. Чтобы исправить, добавьте (! * /), Который соответствует любым подкаталогам (рекурсивно) в текущем каталоге. Это не поможет родительскому ответу, а именно внесению в белый список определенных файлов (если они находятся в подкаталогах, вы, вероятно, захотите вручную указать полный путь или использовать специфичные для каталога файлы .gitignore).
Показать ещё 13 комментариев
547

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

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml
  • 36
    Отличный ответ, но для всех, кто сталкивался с этим позже, стоит отметить, что foo и foo/* - это не одно и то же. Чтобы это работало, вам нужно использовать foo/* для базовой папки
  • 13
    @Mayank Pippo по-итальянски тупой, а Paperino - по имени Дональд Дак, а Плутон такой же, как и по-английски. Раньше они были очень распространенной тройкой имен переменных для программирования примеров. Было приятно прочитать их снова .. :)
Показать ещё 5 комментариев
182

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

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

# 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

  • 3
    Очень умно, спасибо. IMO, это лучший способ сделать это для сайтов WordPress с минимальным количеством правил включения. Кроме того, любые новые плагины, темы или обновления WP не удаляются и не добавляются без вашего явного разрешения. При использовании GitHub Desktop я считаю, .DS_Store файлы .DS_Store не игнорируются, но через командную строку это не проблема. Чтобы обойти это, мне пришлось переместить **/.DS_Store ниже всех других правил.
  • 6
    Моя внутренняя подсветка синтаксиса странно реагирует на заголовок вашего поста.
Показать ещё 3 комментария
61

Немного более конкретно:

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

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

FAILS

webroot/cache*
!webroot/cache/.htaccess

WORKS

webroot/cache/*
!webroot/cache/.htaccess
51
# ignore these
*
# except foo
!foo
23

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

Например, игнорировать все в папке "приложение", кроме index.php, и папка "config" обратить внимание на порядок.

Сначала вы должны отказаться, хотите, чтобы вы захотели.

FAILS

application/*

!application/config/*

!application/index.php

WORKS

!application/config/*

!application/index.php

application/*

  • 36
    Неправильно. Вы отрицаете после "игнорировать все".
  • 12
    это никоим образом не работает
Показать ещё 3 комментария
19

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

13

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

!app/

app/*
!app/bower_components/

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

Это игнорирует все файлы/подпапки внутри bower_components, за исключением /highcharts.

12

Есть несколько подобных вопросов по этому поводу, поэтому я опубликую то, что я написал раньше:

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

# 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/**/*

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

  • 1
    Это единственный метод, который работает исключительно для включения определенных расширений файлов. Еще лучше, это делает большое искусство ASCII: gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
9

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

Не работает:

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

Работает:

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

Что для меня работало, я хотел зафиксировать только один плагин Cordova для репо:

...
plugins/*
!plugins/cordova-plugin-app-customization
7

У меня есть 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

Надеюсь, что кто-то найдет это полезным.

5

Я перепробовал все ответы, приведенные выше, но у меня не получилось. Прочитав документацию 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/

Иначе это не будет работать, как ожидалось.

3

У меня также были некоторые проблемы с отрицанием отдельных файлов. Я смог их зафиксировать, но моя 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.

Отличная тема! Эта проблема беспокоила меня некоторое время;)

3

Пока у меня ничего не получалось, потому что я пытался добавить одну банку из lib.

Это не сработало:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

Это сработало:

build/*
!build/libs
2

Я получил это работает

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib
2

Простое решение, если вам нужно игнорировать все, кроме нескольких файлов и нескольких корневых папок:

/*
!.gitignore
!showMe.txt
!my_visible_dir

Магия находится в /* (как описано выше), она игнорирует все в (корневой) папке, но НЕ рекурсивно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню