如何 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/Debug
或 bin/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 用法。 dirname
、dirname/
和 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 忽略子文件夹/子目录?的主要内容,如果未能解决你的问题,请参考以下文章