Windows .git忽略任何级别的NuGet packages文件夹,但包括任何级别的.targets文件

Windows .git忽略任何级别的NuGet packages文件夹,但包括任何级别的.targets文件,windows,git,nuget,gitignore,Windows,Git,Nuget,Gitignore,我正在尝试为该应用程序实施变通方法 这涉及到忽略层次结构中任何级别的所有包文件夹的内容。但是,不应忽略.targets文件(通常位于包文件夹的子文件夹中) 例如: .gitignore YourProject/ YourProject.csproj packages/ repositories.config Microsoft.Bcl.Build.1.0.7/ lib/ foo.dll tools/ Microsof

我正在尝试为该应用程序实施变通方法

这涉及到忽略层次结构中任何级别的所有包文件夹的内容。但是,不应忽略.targets文件(通常位于包文件夹的子文件夹中)

例如:

.gitignore YourProject/ YourProject.csproj packages/ repositories.config Microsoft.Bcl.Build.1.0.7/ lib/ foo.dll tools/ Microsoft.Bcl.Build.targets 这也不是:

packages/*
!packages/**/*.targets
**/packages/*
!**/packages/**/*.targets
这也不是:

packages/*
!packages/**/*.targets
**/packages/*
!**/packages/**/*.targets
更新:

  • 无论packages文件夹在层次结构中的位置如何,这都需要起作用
  • 它需要忽略包、子文件夹、子文件夹等下的文件
  • 其他.gitignore行,如
    bin/
    ,必须继续工作

没有“好”的方法来做这件事(请参见作为证明),但是有一个黑客围绕着它

忽略bat的
包/
的主要问题是,由于忽略了目录,git甚至没有检查它的子目录

解决方案-您必须有2个gitignore文件。一个是常规的,另一个在packages目录中,如下所示:

# 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
#
$mkdir foo
$cd foo/
$mkdir foo
$mkdir foo/酒吧
$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
*
!*/
!*.福
!regular.txt
!.gitignore
$git加上&&git状态
#论分行行长
#
#初始提交
#
#要提交的更改:
#(使用“git rm--cached…”取消存储)
#
#新文件:foo/.foo
#新文件:foo/bar/.foo
#新文件:foo/bar/baz/.foo
#新文件:regular.txt
#

我认为被忽略路径的优先级很重要

我修复了这个问题,首先指定保留什么,然后忽略包的其余内容

.gitignore
文件中,确保您应该具有:

!packages/repositories.config
packages/


请注意,我的
.gitignore
文件是的简单副本,我想您可以使用
!*。目标\n/packages/*.
(其中\n是换行符),但这不会忽略无扩展文件。问题是
*
目录也匹配。@vcsjones刚刚尝试过;那也不行。它添加了包下的所有DLL。谢谢!例如,您可能希望在baz下包含一个不需要的文件,以表明未添加该文件。另外,由于我不想指定每个项目文件夹,因此我似乎可以将您的项目替换为
**
。最后,它应该是目标,而不是目标。(不是为了我,而是为了将来的读者。)在进一步的测试中,这不起作用(至少在Windows下是这样)。要进行演示,请在
baz\fez
下创建文件
dispured.txt
。将添加该文件。此操作已关闭:
***/baz/*\n**/baz/***\n!*/\n!*。foo
。至少还有一个问题:不忽略目录会影响其他.gitignore行,比如
bin/
。哇-我最后的评论仍然不够。显然你必须做
***/packages/***/***
***/packages/***/***/***
,等等。请告诉我有更好的方法。@TrueWill很好。从头开始重新编写答案,在新示例中,
foo/
中的所有内容都被忽略。