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

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

12 ответов

Решение

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

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

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

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

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

/js

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

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

/js/* 

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

!/js/jquery

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

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

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

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

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

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

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

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

...

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

Для вложенных папок я придумал решение, основанное на ответе Матисса .

Допустим, я хочу игнорировать все в build/каталог (который находится в /app). Итак, я делаю:

      build/*

Однако, если я хочу исключить build/outputs/bundle/releaseподпапка, мне нужно поиграть в прятки!

      
/app/build/*
!/app/build/outputs
/app/build/outputs/*
!/app/build/outputs/bundle
/app/build/outputs/bundle/*
!/app/build/outputs/bundle/release

Важные заметки:

  • Все пути должны начинаться с /и быть относительно .gitignore
  • Вы должны сделать это по одной подпапке за раз. Вы можете увидеть в VS Code (например), что он включает, а что нет на каждом шагу.

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

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

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

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

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

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

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

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

Решение зависит от отношения между правилом игнорирования 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
    

Вот как я это делаю с файлом README.md в каждом каталоге:

      /data/*
!/data/README.md

!/data/input/
/data/input/*
!/data/input/README.md

!/data/output/
/data/output/*
!/data/output/README.md

Если у вас есть каталог и вы хотите игнорировать все, за исключением некоторых файлов (например, *.py files) вы можете:

      sub-dir/**/*.*
!sub-dir/**/*.py

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

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

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

Другие вопросы по тегам