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


326

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


8
возможный дубликат исключений в .gitignore
wallyk

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

Ответы:


447

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

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

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

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


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

Что здорово, если у вас есть только один файл, и менее полезно, если вам нужен шаблон
Лиам


15

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

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

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

...

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


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]/шаблон.


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


1
это работает для кого-нибудь? кажется, не работает для меня.
Анкур
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.