【问题标题】:How to git ignore subfolders / subdirectories?如何 git 忽略子文件夹/子目录?
【发布时间】:2011-02-02 11:42:58
【问题描述】:

我的 .Net 解决方案中有很多项目。我想排除所有“bin/Debug”和“bin/Release”文件夹(及其内容),但仍包括“bin”文件夹本身和其中包含的任何 dll。

.gitignore 带有“bin/”会忽略“Debug”和“Release”文件夹,以及“bin”文件夹中包含的任何 dll。

bin/Debugbin/Release.gitignore 文件中不排除目录,除非我将忽略模式完全限定为 Solution/Project/bin/Debug - 我不想这样做,因为我需要包含此完整模式对于我的解决方案中的每个项目,以及为添加的任何新项目添加它。

有什么建议吗?

【问题讨论】:

  • 为什么要添加DLL?如果您要引用第三方 DLL,则添加一个所有项目随后引用的公共文件夹可能是有意义的。
  • Paddy 说得对——如果这些是第三方 DLL,它们可能应该远离您的代码进行组织。不过,对我来说,听起来您正在检查自己的构建产品,这通常不是您想要的方式。您使用 git 来跟踪 信息,这些信息完全包含在代码和构建配置中。产品就是产品。跟踪它们是自找麻烦 - 例如,如果您更改代码但忘记构建和签入新产品怎么办?
  • 我在排除子文件夹时遇到了问题。尝试了一切,包括这里写的确切示例,但没有成功。最后我在文件夹模式之间添加了一个额外的空白行,它正在工作。可能是编码问题。我有窗口并用 UTF8 编码。

标签: git directory ignore gitignore


【解决方案1】:

你试过通配符吗?

Solution/*/bin/Debug
Solution/*/bin/Release

使用 1.8.2 版本的 git,您还可以使用 ** 通配符来匹配任何级别的子目录:

**/bin/Debug/
**/bin/Release/

【讨论】:

  • 它可以工作,除非有一个包含另一个项目的子文件夹,例如解决方案/模块/项目,所以现在我添加了 /*/*/bin/Debug 和 /*/*/*/bin/Debug (用于子文件夹)。看起来您必须为目录结构中的每个级别添加一个通配符子文件夹。
  • @Marcel:好吧,git 当然不会忽略任何你没有告诉它的文件——它会忽略任何匹配通配符的文件,不多也不少。
  • 我认为双星会跨越目录边界,即:/**/bin/Debug
  • @Taras:不幸的是,它没有。
  • Visual Studio 上有一个与 ** 相关的错误。现在应该修好了。 link
【解决方案2】:

您可以在顶层使用 .gitignore 来忽略项目中所有同名目录。例如:

Debug/
Release/

这应该立即更新,以便在您执行 git status 时可见。确保这些目录尚未添加到 git,因为这将覆盖忽略。

【讨论】:

  • 同样可以通过将模式添加到 OPs $GIT_DIR/.git/info/exclude 文件中来完成。
  • 不同的是.gitignore文件会跟在代码后面,所以它适用于任何地方。而排除文件仅对您的存储库是本地的,这意味着它仅适用于该特定存储库。除非其他提交者有理由想要提交这些目录,否则我建议使用 .gitignore。
  • 另一个问题是,如果您的解决方案中有一个名为 Debug 的项目,那么它也会被忽略。我认为解决方案是所有答案和 cmets 的组合 - 重组解决方案以将常见或引用的 dll 保存在不同的文件夹中,然后忽略“bin/”和/或使用通配符。
  • +1 关于确保目录尚未添加到 git 的评论。如果已经添加到 git,请执行:git rm -rf DirectoryName/
  • 对我不起作用。 build 创建的目录继续弹出未暂存的状态。快把我逼疯。 git rm -rf 报告 foo/ 报告 foo 不存在。
【解决方案3】:

问题不是要忽略所有子目录,而是我在任何地方都找不到答案,所以我将其发布:*/*

【讨论】:

  • 你能澄清一下吗?我对此进行了各种尝试,但无法让git add 忽略一个目录以及该目录的所有子目录中的所有文件。我试过dirname/dirname/*dirname/**dirname/*/*,甚至在绝望中dirname/*/*/*dirname/*/*/*/*dirname/*/*/*/*/*
  • */* 忽略所有子目录,但不忽略当前目录中的文件。忽略特定子目录是正常的 gitignore 用法。 dirnamedirname/dirname/* 都为我工作。该目录中是否已提交任何内容?
  • 这是一个全新的存储库 - 我在尝试之间删除了整个 .git 目录,然后删除了 git init 然后 git add --all .(也尝试过不使用 --all),使用 1.9.4.msysgit .1。我命名目录下的每个非空子目录都被添加到索引中(在 TortoiseGit 和git status 中检查)。在.gitignore 开始! 中没有相关行,但一定有一些冲突。现在通过在add 期间删除文件夹来解决。猜猜这需要更多的挖掘才能提供诊断所需的信息。感谢您向我保证我没有误解语法。
  • 如果我需要忽略文件夹中的一个文件夹,而不是第一个文件夹怎么办?如在 forum/ignorethisfolder/ ...但他不能忽略名为 forum 的文件夹
  • 这不适用于我忽略名称以点开头的目录。 "/." 和 ".*/*" 也不起作用。
【解决方案4】:

以上所有答案都是有效的,但我认为没有提到的是,一旦您将该目录中的文件添加到 repo 中,您就不能忽略包含该文件的目录/子目录(git 将忽略该指令)。

忽略已添加的文件运行

$ git rm -r --cached

否则,您必须先从 repo 的目标目录中删除所有文件 - 然后您可以忽略该文件夹。

【讨论】:

  • git rm --cached 如果您希望它们不被跟踪/与历史记录无关,但希望在本地保持文件完整。
  • 简单:git reset 解决方案,而不是添加到 .gitignore 解决方案/*/bin/Debug,Solution/*/bin/Release,然后 git add Solutions
  • 应该是git rm -r --cached .
【解决方案5】:

我让它在我的机器上工作的唯一方法就是这样做:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

请注意,您必须如何明确允许要包含的每个级别的内容。因此,如果我在主题下有 5 个子目录,我仍然需要将其拼写出来。

这是来自@Yarin 的评论:https://stackoverflow.com/a/5250314/1696153

这些是有用的主题:

我也试过了

*
*/*
**/**

**/wp-content/themes/**

/wp-content/themes/**/*

这些都不适合我。很多线索和错误!

【讨论】:

    【解决方案6】:

    忽略所有子文件夹,同时继续跟踪 /bin 目录中的文件的通用方法是将以下行添加到项目的 .gitignore 文件中:

    bin/*/*
    

    如果您只想忽略特定命名的子文件夹,您可以这样做:

    bin/Debug/*
    bin/Release/*
    

    注意。如果 bin 目录不在项目的根目录中(与 .gitignore 文件一起),则代替例如。 bin/*/* 你可能需要path/to/bin/*/*

    【讨论】:

      【解决方案7】:

      除了将正确的条目放入您的 .gitignore 文件之外,如果您试图忽略已添加到 repo 中的某些内容,您必须在将目录添加到您的 .gitignore 文件之前执行git rm -r /path/to/dir 并提交它。否则 git 唯一会忽略的是你的忽略指令。

      【讨论】:

        【解决方案8】:

        要忽略所有子目录,您可以简单地使用:

        **/
        

        这适用于 git 的 1.8.2 版。

        【讨论】:

          【解决方案9】:

          排除内容和子目录:

          **/bin/*
          

          要排除所有子目录但获取内容,请添加“/”:

          **/bin/*/
          

          【讨论】:

          • 此线程中的最佳答案谢谢!
          【解决方案10】:

          为了忽略子文件夹而不是主文件夹,我只能通过在主文件夹中放置一个虚拟的 readme.txt 来使其在 Visual Studio Code 中工作。只有这样 /*/ 才签入主文件夹(并且没有子文件夹)。

          【讨论】:

            【解决方案11】:

            这么多年后,这个页面似乎仍然出现在 Google 搜索的顶部...

            现代版本的 Git 支持在单个存储库中嵌套 .gitignore 文件。只需在要忽略的子目录中放置一个 .gitignore 文件。使用单个星号来匹配该目录中的所有内容:

            echo "*" > /path/to/bin/Debug/.gitignore
            echo "*" > /path/to/bin/Release/.gitignore
            

            如果您之前进行过提交,请记住删除之前跟踪的文件:

            git rm -rf /path/to/bin/Debug
            git rm -rf /path/to/bin/Release
            

            您可以通过git status 向您显示所有从跟踪中删除的文件来确认它。

            【讨论】:

              【解决方案12】:

              忽略 .gitignore 文件中存储库根目录的所有子文件夹的最简单形式是:

              */
              

              如果您想忽略另一个子文件夹的所有子文件夹:

              subfolder/*/
              

              如果您已经提交了需要忽略的项目,则需要在忽略它们之前将它们从 repo 中删除。

              要删除你的 repo 根目录的所有子文件夹:

              git rm -r --cached */*
              

              删除另一个子文件夹的所有子文件夹:

              git rm -r --cached subfolder/*/*
              

              【讨论】:

              • 感谢我使用了 .vscode/*/ 我会在您的解决方案中添加“忽略子文件夹但在此文件夹的根目录中包含文件。
              • 谢谢,想知道为什么将文件添加到 .gitignore 不起作用;他们已经提交到 repo
              猜你喜欢
              • 2014-05-06
              • 2021-12-20
              • 2022-10-03
              • 2011-08-12
              • 2013-09-26
              • 2010-11-08
              • 1970-01-01
              • 2018-05-22
              • 1970-01-01
              相关资源
              最近更新 更多