为什么“ git log-foo”不适用于已删除的文件 foo?

我的存储库发生了以下变化:

  1. 一些无关的犯罪。
  2. 提交包含100行内容的新文件 foo
  3. 其中一些碰到了 foo
  4. 在同一次提交中,将 foo的内容插入到现有文件 bargit rm foo的顶部
  5. 更多不相干的犯罪。

现在我想看到删除文件 foo的日志。我读过的所有内容,包括 SO,都说我应该能够执行 git log -- foo,但是该命令不产生任何输出。

如果我发现提交包括删除 foo,我可以 git log 1234abcd -- foo和看到它的日志,所以我认为我的路径到 foo不是问题。还要注意的是,git merge-base HEAD 1234abcd输出 1234abcd[...],所以我认为这应该证明提交是可以从 HEAD到达的。注意,在我的工作树中没有 foo文件(很明显,因为它已经被删除了)。在 OS X 上使用 Git 1.7.1.1。

为什么 git log -- foo不能为我工作,我怎样才能修复它? 谢谢!

25244 次浏览

You want to use the --follow option on git log, which is described in the man page as:

Continue listing the history of a file beyond renames.

Effectively, not only does this allow you to see the history of a renamed file, but this also allows you to view the history of a file no longer in the working tree. So the command you should use should look something like:

git log --follow -- foo

Update:

Git 2.9+ has now enabled this by default for all git diff and git log commands:

The end-user facing Porcelain level commands in the "git diff" and "git log" family by default enable the rename detection; you can still use "diff.renames" configuration variable to disable this.

Thanks to x-yuri for the heads up!