我有一个非常古老的git存储库(大约六年),并注意到我没有看到我对git status输出中的文件所做的更改.
我在有问题的特定文件上运行命令:
$ git status Data/schema.sql
$
Run Code Online (Sandbox Code Playgroud)
并没有输出!此文件从一开始就在repo中.另外,如果我将repo签出到另一个目录,那么该文件就会出现(奇怪的是).
我看到了同样的git diff Data/schema.sql和git log Data/schema.sql.
通常,当这样的事情发生时,这是一个gitignore问题.但即使删除我的.gitignore文件也不会导致此行为发生变化.
什么可能导致这种行为?
这种"症状"有两种可能的"诊断":
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 log或git 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文档.