关于 git:gitignore – 在结帐时隐藏被忽略的文件

gitignore - hide ignored files during checkout

这是我的问题(通过示例步骤):

  • 我有一个带有两个不同分支(branchA 和 branchB)的 Git 存储库,它们目前是相同的。
  • 签出到 branchB 并创建一个新文件 "foo.txt"。
  • 将该文件添加到该分支的 ".gitignore" 中,以便在 branchB 中成功忽略它。
  • 创建另一个文件"hello.txt",暂存并提交。
  • 结帐到分支 A。
  • foo.txt 出现在 branchA 中,但 hello.txt 没有。

为什么 foo.txt 出现在 branchA 中而不像 hello.txt 那样得到"隐藏"?

从我的angular来看,这很烦人,看起来像是一个错误/功能请求,但 Git 是否被设计成这样?我很惊讶地发现没有其他人抱怨这个。


这不是错误。要了解它的工作原理,您需要了解一些事情。

  • .gitignore 不是"自动"全局应用的。你需要提交它。
  • 任何未提交的文件都将在每个分支中可见。切换分支时,您应该 commit 文件,或者您可以 stash 文件。

另外,这个问题以前也有人问过,不过我不怪你没有在搜索中找到它。在不同的 git 分支中处理两个不相关的文件


foo.txt 没有出现在branchA 中,它只是不再被忽略,因为当您签出branchA 时,您对.gitignore 的更改(我假设您将这些提交给branchB)丢失了。 foo.txt 只是一个未跟踪的文件。当您切换到 branchA 时让 foo.txt "disappear" 表示您希望从工作目录中删除该文件。这与忽略文件非常不同。

无论您使用 $GIT_DIR/info/exclude 文件检出哪个分支,您都可以指定忽略影响整个存储库的模式。但是,这是您的存储库本地的,因此此文件中指定的忽略模式不会传播到其他存储库。参见 gitignore(5)。


快速回答:

  • hello.txt 不是"hidden",它已提交给 branchB,因此在将 branchB 合并或变基到 branchA 之前,您不会在 branchA 中看到
  • .gitignore 也是如此。如果你将 .gitignore 提交给了 branchB(我猜你是这样做的),然后签出 branchA,那么,branchA 没有 .gitignore 文件,这就是你看到 foo.txt 的原因。同样,您需要将 branchB 合并或变基到 branchA