Git 没有正确检测某些文件的修改?

Git does not properly detect modification of certain files?

我注意到 Git 没有正确检测到由 TI 的 Code Composer Studio (Eclipse) 生成的修改后的 .out 文件(它们已经在索引中)。在 compiling/building 之后,调用 git status 会在 changes to be committed(已删除)和 untracked files 下显示 .out 文件,而不是在 changes not staged for commit 中。知道是什么导致某些文件变成这样吗?

这不是 GIT 的问题。按照设计,这就是它的工作原理。我 运行 测试要仔细检查,但如果:

  1. 文件 file.out 是树的一部分
  2. Something/one运行s git rm file.out。它必须是 git rm,如果不进行删除,则不会重现。
  3. 您创建了一个同名文件。它将被列为未跟踪。

这是标准的 GIT 行为。暂存更改是 "almost" 提交的,就像重新创建以前在不同提交中删除的文件一样,将被列为新文件,因此它会在这里发生。请注意,如果删除未分阶段执行,则会发生您期望的正确行为 - git 将知道它是同一个文件。

git了解文件是相同的,您需要运行

  1. git add file.out

所以 git 看到同一个文件仍然存在于暂存区,并且只列出一个 modified 已暂存以提交。它这样工作的原因是有一个额外的半提交层,你仍然可以玩和重置(就像游戏中的检查点)。

至于为什么作曲家这样做我不确定。我认为正确的行为是暂存所有文件更改,所以我不知道为什么没有将新文件添加到树中。如果这只是一个不属于源代码的日志输出,请考虑将 *.out 添加到 .gitignore,但您必须确保 Composer 没有添加它(并绕过忽略)。

如果文件存在于当前提交中但不在索引中,则该文件的状态为 "deleted"。

如果文件存在于工作树中但不在索引中,则该文件未被跟踪。

在这种情况下,两者都是正确的:文件在当前提交中(永远冻结在那里,以及所有其他冻结到提交中的文件),不是 在索引中(因为某人或某事将其从索引中删除),并且 在工作树中。根据您在 中的描述,IDE 可能 运行 git rm 从索引和工作树中删除文件,或者 运行从工作树中删除文件后但在工作树中重新创建文件之前,相当于 git add -u

(git add 命令注意到文件从工作树中丢失,将从索引中删除 文件。随后的 git add, 运行 当文件 在工作树中时,会将其复制到索引中,但是您需要 git add 的变体,它添加了一个索引中不存在的文件。)