如何 git 忽略子文件夹/子目录?

Posted

技术标签:

【中文标题】如何 git 忽略子文件夹/子目录?【英文标题】:How to git ignore subfolders / subdirectories? 【发布时间】: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 编码。 【参考方案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://***.com/a/5250314/1696153

这些是有用的主题:

How do negated patterns work in .gitignore? How do gitignore exclusion rules actually work?

我也试过了

*
*/*
**/**

**/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

以上是关于如何 git 忽略子文件夹/子目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略 Git 目录中的文件?

我如何告诉 Git 忽略除子目录之外的所有内容?

git忽略指定的文件

如何创建.gitignore文件,忽略不必要提交的文件

git 忽略特定类型的所有文件,特定子文件夹中的文件除外

如何创建.gitignore文件,忽略不必要提交的文件