мерзавец игнорировать исключение

326

У меня есть файл gitignore, который заставляет git игнорировать *.dllфайлы, и это именно то поведение, которое мне нужно. Тем не менее, если я хочу исключение (то есть, чтобы иметь возможность фиксировать foo.dll), как я могу этого достичь?

roundcrisis
источник
8
возможный дубликат исключений в .gitignore
wallyk
fwiw, дедушка повторяющихся ответов на эту тему - тот, который вы должны просмотреть - вероятно, будет Make .gitignore игнорировать все, кроме нескольких файлов - очень регулярное действие и несколько хороших ответов. Я - большой поклонник этого ответа , который кажется ясным и тщательным.
Кей V

Ответы:

447

Использование:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

Из гитиньоре :

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

Skilldrick
источник
22
Смотрите также форму ответа @Matiss Jurgelis - это важное дополнение
Дан
7
Могу ли я добавить исключение в gitignore моего проекта, а не в глобальное gitignore? Например, если я хотел включить все библиотеки DLL в каталог? Мой gitignore_global есть *.dllв нем, а gitignore моего проекта есть, !Libs/*.dllно, похоже, это не работает.
Джоэл Кинзел
1
@jkinz, ты должен попробовать !Libs/**/*.dll.
Росберг Линхарес
@RosbergLinhares Или !**/Libs/*.dll, в зависимости от структуры папок.
JAB
2
Спасибо, но на Mac добавление комментария в той же строке, что и команда, !foo.dllсделало недействительной. Если я добавлю комментарий в отдельной строке, это будет работать.
Джакомо
261

Git игнорирует папки, если вы пишете:

/js

но он не может добавлять исключения, если вы делаете: !/js/jqueryили !/js/jquery/или!/js/jquery/*

Вы должны написать:

/js/* 

и только тогда вы можете, кроме подпапок, как это

!/js/jquery
Матисс
источник
44
Это очень важно Спасибо!
VisioN
3
Однако похоже , что Вы не можете добавлять вложенные папки, например , !/js/jquery/xyzlibне будут игнорироваться ...
Невежественные
2
Как говорит @Ignorant, папка, которую вы «кроме» из правила игнорирования, должна находиться в том же месте, что и «*»
The Red Pea
3
так /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Похоже, довольно забавный способ сделать это ...
Вечная ночь
ты действительно помог мне
Loyea
55

Вы можете просто git add -f path/to/foo.dll.

.gitignore игнорирует только файлы для обычного отслеживания и тому подобное git add .

Нильс Ридеманн
источник
4
Просто для получения более подробной информации, -fgit сообщает о принудительном добавлении этого файла в репозиторий, так как он может сначала проигнорировать его из-за вашего.gitignore
RPDeshaies
Что здорово, если у вас есть только один файл, и менее полезно, если вам нужен шаблон
Лиам
19

Чтобы исключить все в каталоге, кроме некоторых подкаталогов, выполните следующие действия:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Источник: https://gist.github.com/444295

Саймон Паарлберг
источник
15

Просто добавьте !перед правилом исключения.

Согласно странице руководства gitignore :

Шаблоны имеют следующий формат:

...

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

!foo.dll в .gitignore, или (каждый раз!) git add -f foo.dll

Тобиас Кинцлер
источник
4

Если вы работаете с Visual Studio и ваш .dll находится в binпапке, то вам нужно добавить исключение для самой конкретной папки bin, прежде чем вы сможете добавить исключение для файла .dll. Например

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Это связано с тем, что .gitignoreфайл Visual Studio по умолчанию содержит шаблон игнорирования для[Bbin]/

Этот шаблон выгружает все папки bin (и, следовательно, их содержимое), что делает любую попытку включить содержимое избыточным (поскольку сама папка уже игнорируется).

Я смог выяснить, почему мой файл не был исключен при запуске

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

из окна Git Bash. Это вернуло [Bbin]/шаблон.

DeanOC
источник
2

Решение зависит от отношения между правилом git ignore и правилом исключения:

  1. Файлы / Файлы на одном уровне: используйте решение @Skilldrick .
  2. Папки / подпапки: используйте решение @Matiss Jurgelis .
  3. Файлы / Файлы на разных уровнях или Файлы / Подпапки: вы можете сделать это:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    
Росберг Линхарес
источник
1

Начиная с Git 2.7.0, Git будет учитывать исключения. Из официальных заметок о выпуске:

  • Позвольте более позднему "! / Abc / def" переопределить более ранний "/ abc", который появляется в том же файле .gitignore, чтобы упростить выражение "все в каталоге / abc игнорируется, кроме ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

Erfan
источник
1
это работает для кого-нибудь? кажется, не работает для меня.
Анкур