GitIgnore - 忽略 bin/ 但包含 bin/*.refresh

18

我想忽略Web项目中的 bin 文件夹,但是包括在该 bin 文件夹中的 .refresh 文件。

这是我在 .gitignore 文件中的内容:

[Bb]in/
#Allow .refresh files for web sites
![Bb]in/*.refresh

但是这不起作用。我做错了什么?我也尝试过:

!*.refresh

结果相同。

更新:

如果有助于诊断问题,这是文件结构:

\rootfolder
    .gitignore
    \project1
         \bin
              file1.dll
              file1.dll.refresh

你可以看到我们的 gitignore 文件位于哪里。我们不想要 .dll 文件,但是我们需要 .refresh 文件。


2
可能是重复的问题:如何在 .gitignore 中使用否定模式? - Cascabel
2
这是一个重复内容。这两个答案与其他问题中的内容完全相同,只是将子目录更改为目录中的通配符路径。当然,它们也不完整:您还需要忽略[Bb]in/.*,因为*无法匹配隐藏文件。(而且你没有找到它并不意味着它不是重复的。) - Cascabel
@Jefromi是正确的。但我想知道你是如何找到这些重复项的。 - manojlds
已接受一个答案。仍然不同意这是重复,因为这是一个与.gitignore文件位置有关的问题,就像@manojlds指出的那样。我没有看到其他人询问这种常见情况(在.NET开发下)。 - Nicholas Head
@manjlds:那个我作弊了:我记得我至少回答过其中一个(很可能更多——就像你说的,它们很难找到),所以我只是作弊并搜索了“is:answer user:me gitignore”。 - Cascabel
显示剩余2条评论
6个回答

15

这种方式对我没有起作用:

[Bb]in/*
![Bb]in/*.refresh

我在.gitignore文件中使用下面的语法,效果很好。

你可以尝试一下:

**/[Bb]in/*
!**/[Bb]in/*.refresh

如果使用manojlds的解决方案遇到问题,请尝试这个。最后一部分是我需要的,终于让它正常工作了。 - NightOwl888
3
这应该是正确的答案。这是唯一适用于asp.net刷新文件要求的解决方案。 - Erick T
当Bin目录中有一个子文件夹时怎么办?比如使用Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0包时出现的"roslyn"?是否有一种方法可以排除Bin中任何子目录中的.refresh文件?即使Bin本身可能是一个嵌套的子目录? - Mihai Caracostea
这个在 VisualStudio 2017 上非常好用,感谢 @Leandro Sá - gReX

9
尝试执行以下操作:
[Bb]in/*
![Bb]in/*.refresh

这是因为当你只输入 bin 或 bin/ 时,它根本不会进入文件夹查找文件。你必须明确地告诉它去文件夹,但忽略所有内容,然后说不要忽略 *.refresh。
针对 OP 的结构进行编辑:
然后你将不得不在 .gitignore 中的路径中包含 project1:
1)包含project1:
project1/bin/*
project1/bin/*.refresh

或者

2) 在project1中添加一个.gitignore文件(我建议这样做),并复制之前的内容。


很不幸,它不能正常工作。现在它正在尝试添加bin/中的所有.dll / etc文件--请参见我的编辑,也许这是一个子目录问题? - Nicholas Head
我已经接手你的更改,更新了.gitignore文件并执行了“git add .”,然后它继续将所有我的bin文件夹/.DLL添加到待处理更改中。我是一个Git新手,恐怕似乎有些东西出了问题。也许是Windows-Git中的一个bug? - Nicholas Head
@Nicholas - 为你的结构更新了答案。 - manojlds
很遗憾,这个解决方案不起作用。可行的方法是注释掉[Bb]in/这一行,只将.refresh文件添加到仓库中,然后再次注释它。虽然不是一个解决方案,但是可以作为一种变通方法。幸运的是,项目引用通常不会经常更改。 - NightOwl888

5

我知道这是一个旧帖子,但我仍然遇到了这个问题,并且在使用MsysGit 1.8.0时,我无法使用@manojlds的答案。

看起来唯一可以排除所有深度的bin文件夹的模式是[Bb]in[Bb]in/。根据gitignore手册,带有尾随斜杠的那个是最正确的,因为它只匹配目录,而不是名为“bin”的文件。只要我尝试将其他级别添加到模式中,例如[Bb]in/*,这就停止在任何深度匹配并相对于.gitignore文件的位置,如手册中所述。

现在,假设我在我的全局.gitignore文件中有一个[Bb]in/条目,则我发现在bin文件夹中取消忽略特定模式的文件(例如.refresh文件)的最佳方法是创建另一个.gitignore文件,位于bin文件夹的上一级目录中(即项目的目录),并在其中放置以下条目:

![Bb]in/
[Bb]in/*
![Bb]in/*.refresh

我们的网站项目bin文件夹从不包含像Debug或Release这样的子文件夹,但我进行了测试,它仍然会忽略bin文件夹中的子文件夹,如所需。
如果我只使用第二个和第三个条目,正如被接受的答案所建议的那样,它就行不通。一个直观的解释是第一个条目从全局 glob 中移除了这个特定的 bin 文件夹,因此它的内容将被包含,然后第二个条目按照预期工作,因为在这种情况下它相对于.gitignore文件,第三个条目从第二个条目创建的 glob 中删除所需的模式。

3

另一种解决方案可能是通过命令行强制包含 .refresh 文件。

git add *.dll.refresh --force

--force
允许添加被忽略的文件。

然后您可以在 .gitignore 文件中排除 bin 文件夹中的所有内容。如果您添加了新的包,您需要再次强制包含新的 .refresh 文件。


3
以下方法对我有效:
[Bb]in/*
![Bb]in/*.refresh

请注意,第一行末尾添加了一个星号,以匹配 bin 目录下的所有内容,而不是目录本身。这样,您可以从 glob 中添加一个 *.refresh 的例外。

很遗憾,它不起作用。现在它正在尝试添加bin/中的所有.dll / etc文件 - 请查看我的编辑,也许这是一个子目录问题? - Nicholas Head
当使用*/[Bb...和!/[Bb...时,它是否有效?也就是说,在两个通配符前都加上 /。 - Dominik Honnef

3
使用Roslyn(针对网站项目启用最新的C#和VB功能),现在将会有一个子目录位于“bin”中,其中包含您需要的.refresh文件。由于git的默认行为是一旦排除了文件夹,则其中的任何异常都将永远不会被发现(/directory / *与/directory/ **/ 之间的区别),因此这可能会成为一个头疼问题。
因此,我们需要bin如下所示: ** / [Bb]in / ** / * . * 否则,整个roslyn目录将被忽略,然后 !** / * .refresh

构建是否真的对您有用?Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll已恢复,但roslyn目录中的文件未恢复,因此构建失败。 - user247702
我认为它在某个时候又出了问题,因为.refresh文件指向上一个目录而不是上两个目录。在那个时候,我想我们只是将所有的Roslyn文件包含到Git中。 - Mark Sowul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接