.gitignore Папка пакетов NuGet на любом уровне, но включает файл .targets на любом уровне

Я пытаюсь реализовать обходной путь для Проблемы восстановления пакета NuGet.

Это включает в себя игнорирование содержимого всех папок пакетов на любом уровне иерархии. Однако файлы .targets(обычно в подпапках папок пакетов) не должны игнорироваться.

Например:

.gitignore
YourProject/
  YourProject.csproj
  packages/
    repositories.config
    Microsoft.Bcl.Build.1.0.7/
      lib/
        foo.dll
      tools/
        Microsoft.Bcl.Build.targets

Должны включать только файлы:

  • .gitignore
  • YourProject.csproj
  • Microsoft.Bcl.Build.targets

Windows, git версия 1.8.1.msysgit.1.

Я прочитал несколько ответов на StackOverflow, проверил справочную страницу и пробовал множество вариантов без успеха.

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

packages/*
!*.targets

И это:

packages/*
!packages/**/*.targets

И это:

**/packages/*
!**/packages/**/*.targets

Update:

  • Это должно работать независимо от того, где находится папка пакетов в иерархии.
  • Необходимо игнорировать файлы под пакетами, подпапками, подпапками и т.д.
  • Другие строки .gitignore, такие как bin/, должны продолжать работать.

Ответ 1

Нет никакого "хорошего" способа сделать это (см. manpage как доказательство), однако есть обход вокруг него.

Основная проблема с игнорированием packages/ биты заключается в том, что git даже не проверяет подкаталоги из-за игнорирования директории.

Решение здесь - вам нужно будет иметь 2 файла gitignore. Один регулярный и один внутри каталога пакетов, который выглядит следующим образом:

# ignore all files
*
# do not ignore directories
!*/
# do not ignore targets
!*.targets
# do not ignore gitignore
!*.gitignore

Новый пример:

$ mkdir foo
$ cd foo/
$ mkdir foo
$ mkdir foo/bar
$ mkdir foo/bar/baz
$ touch foo/.foo
$ touch foo/bar/.foo
$ touch foo/bar/baz/.foo
$ touch regular.txt
$ touch foo/ignored.txt
$ touch foo/bar/baz/ignored-2.txt
$ cat foo/.gitignore
*
!*/
!*.foo
!regular.txt
!.gitignore
$ git add . && git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   foo/.foo
#       new file:   foo/bar/.foo
#       new file:   foo/bar/baz/.foo
#       new file:   regular.txt
#

Ответ 2

Приоритет игнорируемых путей важен, я беру его.

Я исправил эту проблему, указав сначала, что следует оставить, чтобы игнорировать остальную часть содержимого пакетов.

В файле .gitignore убедитесь, что у вас должно быть:

!packages/repositories.config
packages/

См. https://github.com/danyandresh/Research/commit/65291219a1c1fbcdb2216c686767e8c46451baa1

Обратите внимание: мой файл .gitignore является простой копией Список игнорирования Visual Studio, найденный в github