为什么git log/status不返回输出?

Bil*_*ill 5 git

我有一个非常古老的git存储库(大约六年),并注意到我没有看到我对git status输出中的文件所做的更改.

我在有问题的特定文件上运行命令:

$ git status Data/schema.sql
$
Run Code Online (Sandbox Code Playgroud)

并没有输出!此文件从一开始就在repo中.另外,如果我将repo签出到另一个目录,那么该文件就会出现(奇怪的是).

我看到了同样的git diff Data/schema.sqlgit log Data/schema.sql.

通常,当这样的事情发生时,这是一个gitignore问题.但即使删除我的.gitignore文件也不会导致此行为发生变化.

什么可能导致这种行为?

Nic*_*kin 6

这种"症状"有两种可能的"诊断":

历史上一个不区分大小写的强制重命名

诊断:

git ls-files
Run Code Online (Sandbox Code Playgroud)

搜索具有不同大写的路径:

some/path/foo
Some/path/bar
Run Code Online (Sandbox Code Playgroud)

git mv -f Some/path/* some/path/
Run Code Online (Sandbox Code Playgroud)

将所有文件(/*)移动到重命名的路径非常重要.现在他们都将拥有一条道路.

可能的原因

可能some/path存在多个文件的情况,在路径中使用不同的字母大小写进行跟踪.对于这样的文件,提供"不正确"的路径git loggit status导致日志输出中某些提交的不公平.

这个错误可以git mv -f <path/file> <PATH/file>在Git 1.9.5上重现,也许在较新的版本上(稍后会检查).

git log Some/path/foo
Run Code Online (Sandbox Code Playgroud)

日志不会包含git mv -f some/path/bar Some/path/bar执行之前的一些提交.

标有skip-worktree或的文件assume-unchanged bit

感谢@Zeeker的这一假设.

诊断:

git ls-files -v | grep -E '^(S|[a-z])'
Run Code Online (Sandbox Code Playgroud)

有关其他信息,请查看git ls-files文档.