【问题标题】:GitIgnore - Ignoring bin/ but including bin/*.refreshGitIgnore - 忽略 bin/ 但包括 bin/*.refresh
【发布时间】:2011-12-31 20:15:28
【问题描述】:

我正在尝试忽略 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 文件。

【问题讨论】:

  • 我不同意这是一个骗局——我已经搜索过有人问过类似的问题,但找不到。你提到的那个是在谈论包括一个文件夹。我想包含一个通配符。
  • 这是个骗子。这里的两个答案与另一个问题完全相同,只是将子目录更改为目录中的通配符路径。当然,它们也不完整:您还需要忽略[Bb]in/.*,因为* 与隐藏文件不匹配。 (你没有找到它并不意味着它不是骗子。)
  • @Jefromi 是对的。但是想知道您是如何找到这些骗子的。
  • 接受了答案。仍然不同意这是一个骗局,因为这是 .gitignore 文件所在位置的问题,就像@manojlds 指出的那样。而且我没有看到其他人询问这种常见情况(在 .NET 开发下)。

标签: git gitignore


【解决方案1】:

这种方式对我不起作用:

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

我在 .gitignore 文件上使用了下面的语法并且工作正常。

试试看:

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

【讨论】:

  • 如果 manojlds 的解决方案有问题,试试这个。最后一点是我最终完成这项工作所需要的。
  • 这应该是正确的答案。这是唯一适用于 asp.net 刷新文件要求的解决方案。
  • Bin目录下有子文件夹怎么办?像使用 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0 包时的“roslyn”一样?有没有办法从 Bin 的任何子目录中排除所有 .refresh 文件?而 Bin 本身可能是一个嵌套的子目录?
  • 这一款适用于 VisualStudio 2017,感谢@Leandro Sá
【解决方案2】:

尝试以下操作:

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

这是因为当您只执行 bin 或 bin/ 时,它根本不会进入文件夹来查找文件。您必须明确地说,转到文件夹,但忽略所有内容,然后说不要忽略 *.refresh。

编辑 OP 的结构:

那么你必须要么

1) 在 .gitignore 的路径中包含 project1

project1/bin/*
project1/bin/*.refresh

2)在project1中添加一个.gitignore(我推荐这个)和之前的内容。

【讨论】:

  • 不幸的是,它不起作用。现在它正在尝试在 bin/ 中添加所有 .dll/etc 文件——看我的编辑,也许这是一个子目录问题?
  • 我接受了您的更改,更新了 .gitignore 文件并执行了“git add”。 - 它继续将我所有的 bin 文件夹/.DLL 添加到待处理的更改中。恐怕我是一个 git 新手,但似乎有些东西不能正常工作。也许是 Windows-git 中的错误?
  • @Nicholas - 为您的结构更新答案
  • 很遗憾,这个解决方案不起作用。起作用的是注释掉[Bb]in/ 行,只将.refresh 文件添加到repo,然后重新注释它。不是解决方案,而是解决方法。幸运的是,项目引用通常不会经常更改。
【解决方案3】:

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

似乎在任何深度排除所有 bin 文件夹的唯一模式是 [Bb]in[Bb]in/。根据gitignore man page,带有斜杠的那个是最正确的,因为它只会匹配目录,而不是名为“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 中的所需模式。

【讨论】:

    【解决方案4】:

    以下对我有用:

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

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

    【讨论】:

    • 不幸的是,它不起作用。现在它正在尝试在 bin/ 中添加所有 .dll/etc 文件——请参阅我的编辑,也许这是一个子目录问题?
    • 在使用 */[Bb... 和 !*/[Bb... 时是否有效?也就是说,将 */ 添加到两个 glob
    【解决方案5】:

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

    git add *.dll.refresh --force

    --强制
    允许添加其他被忽略的文件。

    您可以在 .gitignore 文件中排除 bin 文件夹中的所有内容。 如果您添加一个新包,您必须再次强制包含新的 .refresh 文件。

    【讨论】:

      【解决方案6】:

      使用 Roslyn(“为网站项目启用最新的 C# 和 VB 功能”),现在“bin”内将有一个子目录,其中包含您需要的 .refresh 文件。这会让人头疼,因为 git 的默认行为是,一旦您排除文件夹,将永远找不到其中的任何异常(/directory/* vs /directory/**/.

      所以我们需要 bin 如下:

      **/[Bb]in/**/*.*

      否则会忽略整个roslyn目录,然后

      !**/*.refresh

      【讨论】:

      • 构建真的对你有用吗? Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll 已恢复,但roslyn 目录中的文件未恢复,因此构建失败。
      • 我认为它在某个时候又坏了,因为 .refresh 文件指向一个目录而不是两个。那时我认为我们只是将所有 roslyn 文件包含到 Git 中。
      猜你喜欢
      • 2012-02-05
      • 2010-11-22
      • 2013-11-15
      • 2021-07-27
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多