виняток git ignore


326

У мене є файл gitignore, який змушує ігнорувати *.dllфайли git , і це власне поведінка, яку я хочу. Однак, якщо я хочу виняток (тобто, щоб мати змогу здійснити foo.dll), як я можу досягти цього?


8
можливий дублікат Винятку в .gitignore
wallyk

fwiw, дідусь із повторюваних відповідей на цю тему - той, на який слід звернути увагу - мабуть, буде Make .gitignore ігнорувати все, окрім кількох файлів - дуже регулярна діяльність та кілька хороших відповідей. Я є особливим шанувальником цієї відповіді , яка здається чіткою та ґрунтовною.
Kay V

Відповіді:


447

Використання:

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

З gitignore :

Необов’язковий префікс! що заперечує візерунок; будь-який відповідний файл, виключений за попереднім шаблоном, знову буде включений. Якщо заперечений візерунок збігається, це замінить джерела шаблонів нижчих пріоритетів.


22
Дивіться також форму відповіді @Matiss Jurgelis - це важливе доповнення
Dan

7
Чи можу я додати виняток до gitignore мого проекту, а не до мого глобального gitignore? Наприклад, якщо я хотів включити всі DLL в каталог? Мій gitignore_global є *.dllв ньому, а в моєму проекті є gitignore, !Libs/*.dllале це, здається, не працює.
Джоель Кінзель

1
@jkinz, ти повинен спробувати !Libs/**/*.dll.
Розберг Лінхарес

@RosbergLinhares Або !**/Libs/*.dllзалежно від структури папки.
JAB

2
Дякую, але на mac додавши коментар у тому ж рядку, що !foo.dllі команда did, визнала недійсною команду. Якщо я додаю коментар в окремий рядок, він працює.
Джакомо

261

Git ігнорує папки, якщо ви пишете:

/js

але він не може додавати винятки, якщо ви робите: !/js/jqueryабо !/js/jquery/або!/js/jquery/*

Ви повинні написати:

/js/* 

і тільки тоді ви можете крім папок, як це

!/js/jquery

44
Це дуже важливо. Дякую!
VisioN

3
Однак схоже, що ви не можете додати вкладені папки, наприклад !/js/jquery/xyzlib, не будуть проігноровані ...
Ignorant

2
Як говорить @Ignorant, папка, яку ви «крім» з правила ігнорування, повинна знаходитися в тому самому місці, що і «*»
The Red Pea

3
так /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Відчуває себе досить смішним способом це зробити ...
Непрохідна ніч

ти мені справді допоміг.
Лоєя

55

Можна просто git add -f path/to/foo.dll.

.gitignore ігнорує лише файли для звичайного відстеження та інші речі git add .


4
Для отримання більш детальної інформації, -fрозповідає git, щоб змусити додавати цей файл у репо, оскільки він може ігнорувати його спочатку через ваш.gitignore
RPDeshaies

Що чудово, якщо у вас є лише один файл, менш корисний, якщо вам потрібен шаблон
Ліам


15

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

Відповідно до сторінки чоловіка gitignore :

Шаблони мають такий формат:

...

  • Необов’язковий префікс! що заперечує візерунок; будь-який відповідний файл, виключений за попереднім шаблоном, знову буде включений. Якщо заперечений візерунок збігається, це замінить джерела шаблонів нижчих пріоритетів.


4

Якщо ви працюєте з Visual Studio, а ваш .dll знаходиться в binпапці, вам потрібно додати виняток для самої папки бін, перш ніж ви зможете додати виняток для файлу .dll. Напр

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

Це тому, що .gitignoreфайл Visual Studio за замовчуванням містить шаблон ігнорування для[Bbin]/

Цей шаблон закриває всі папки бін (і, отже, їх вміст), що робить будь-яку спробу включити вміст зайвим (оскільки сама папка вже ігнорується).

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

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

з вікна Git Bash. Це повернуло [Bbin]/шаблон.


2

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

  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.