ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

有什么建议么?

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

J
Josh Lee

你试过通配符吗?

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
A
Andreas

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

Debug/
Release/

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


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

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

要忽略已添加的文件,请运行

$ git rm -r --cached .

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


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

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


你有机会澄清一下吗?我对此进行了各种尝试,但无法让 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 的文件夹
这不适用于我忽略名称以点开头的目录。 “/。”和 ".*/*" 也不起作用。
M
MidnightJava

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


r
ruttoa

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

# 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

这些是有用的主题:

.gitignore 中的否定模式如何工作?

gitignore 排除规则实际上是如何工作的?

我也试过

*
*/*
**/**

**/wp-content/themes/**

/wp-content/themes/**/*

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


这种否定模式是完成问题中提出的任务的最正确方法。
A
A. Morel

要排除内容和子目录:

**/bin/*

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

**/bin/*/

在这个线程中的最佳答案谢谢!
正是我想要的
f
frederickjh

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

**/

这适用于 git 版本 1.8.2。


N
Nick F

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

bin/*/*

如果您只想忽略特定命名的子文件夹,您可以执行以下操作:

bin/Debug/*
bin/Release/*

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


T
Tolga

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

*/

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

subfolder/*/

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

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

git rm -r --cached */*

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

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

谢谢我使用了 .vscode/*/ 我将添加到您的解决方案中“忽略子文件夹,但在此文件夹的根目录中包含文件”。
谢谢,想知道为什么将文件添加到 .gitignore 不起作用;他们已经被提交到 repo
s
slackair

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

现代版本的 Git 支持在单个 repo 中嵌套 .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 来确认它,以显示从跟踪中删除的所有文件。


e
edelwater

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