Заставьте .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 ]

8 голосов
/ 30 апреля 2016

Вот что у меня сработало, я хотел добавить в репозиторий только один плагин Cordova:

...
plugins/*
!plugins/cordova-plugin-app-customization
7 голосов
/ 27 января 2015

У меня есть 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 голосов
/ 25 февраля 2019

Я знаю, что опаздываю на вечеринку, но вот мой ответ.

Как сказал @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

Также доступна простая веб-версия здесь

Спасибо.

5 голосов
/ 12 сентября 2018

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

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

Кроме того, похоже, что порядок утверждений не имеет значения . Вместо этого вам нужно явно отменить все подпапки, прежде чем вы сможете отменить отдельные файлы в нем.

Папка !public/typo3conf/ и содержимое папки public/typo3conf/* - это две разные вещи для .gitignore.

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

3 голосов
/ 31 мая 2018

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

/*
!.gitignore
!showMe.txt
!my_visible_dir

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

3 голосов
/ 15 мая 2018

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

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

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

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

build/*
!build/libs
2 голосов
/ 10 сентября 2018

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

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib
0 голосов
/ 13 июня 2019

Вот как я это сделал:

# Ignore everything
*

# Whitelist anything that's 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 вы увидите только папки, которые могут заставить вас думать, что все внутри них отслежено

0 голосов
/ 08 июня 2019

Кажется, я нашел то, что сработало для меня, о чем никто не упомянул.

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

...