为什么git log/status没有输出?

5

我有一个非常旧的git仓库(大约六年),注意到在我的 git status 输出中没有看到我对文件所做的更改。

我针对特定的文件运行了以下命令:

$ git status Data/schema.sql
$

而且没有输出!这个文件从一开始就在仓库里。此外,如果我将仓库checkout到另一个目录,则该文件(奇怪的是)会出现在那里。

我在git diff Data/schema.sqlgit log Data/schema.sql中也看到了同样的情况。

通常,当发生这种情况时,是由于gitignore问题引起的。但即使删除我的.gitignore文件,也没有改变这种行为。

是什么原因导致了这种行为?


如果你执行 git status [remote_name]/master 会发生什么? - locoboy
1
你是否已经使用 skip-worktreeassume-unchanged 标记了该文件? - Sascha Wolf
2
git ls-files -v | grep -i '^S' 应该返回所有标记为这种方式的文件。 - Sascha Wolf
1
@Zeeker,虽然它没有标记,但是这确实帮了我 - 它在列表中显示为"data/schema.sql"(没有大写的"D")。git log data/schema.sql按预期工作。感谢您关于git ls-files的提示!现在,我该怎么办?ls-files显示一些条目为Data/blah.sql,而另一些则为data/blah.sql - Bill
1
@NickVolynkin 工作得非常完美!感谢您的帮助。如果您将此重写为答案,我将非常乐意接受这个答案。 - Bill
显示剩余7条评论
4个回答

5

这个“症状”有两种可能的“诊断”:

不区分大小写的强制重命名历史记录

诊断:

git ls-files

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

some/path/foo
Some/path/bar

解决方案

git mv -f Some/path/* some/path/

重要的是将所有文件(/*)移动到重命名后的路径中。现在它们都会有一个单一的路径。

可能的原因

可能存在这样一种情况,some/path下有多个文件,这些文件在路径中使用了不同的大小写进行跟踪。对于这样的文件,如果在git loggit status中提供“错误”的路径,就会导致日志输出中缺少某些提交。

Git 1.9.5上可以使用git mv -f <path/file> <PATH/file>来重现此错误,较新版本(稍后将进行检查)也可能存在此问题。

git log Some/path/foo

日志中将不会包含在执行git mv -f some/path/bar Some/path/bar之前进行的某些提交。

标记为skip-worktreeassume-unchanged bit的文件

感谢@Zeeker提供这个假设。

诊断:

git ls-files -v | grep -E '^(S|[a-z])'

如需更多信息,请参考git ls-files文档


好的。我需要检查一下 Git 2.0.1,因为有一个修复(https://dev59.com/5Wkv5IYBdhLWcg3wiRWo#24979063)。 - VonC
@NickVolynkin 这是我的建议,我只是纠正了自己的错误。;) - Sascha Wolf
@Zeeker:我并没有看到很多人关心修正自己的错误。 :) - Nick Volynkin

0
我发现,如果使用一些版本的git附带的MINGW64 Bash shell,他们试图管理大小写敏感性可能会导致此错误。要解决问题,请使用正确的大写字母“cd”。在下面的示例中,正确的目录名称是“CalMAN App”。但是,如果您将cd更改为“calman app”,它也可以工作。不幸的是,这会让git感到困惑。
micha@mrosen-win1 MINGW64 ~/dev/CalMAN/src/CalMAN/calman 5 (master)
$ cd "calman app"

micha@mrosen-win1 MINGW64 ~/dev/CalMAN/src/CalMAN/calman 5/calman app (master)
$ git log .

micha@mrosen-win1 MINGW64 ~/dev/CalMAN/src/CalMAN/calman 5/calman app (master)
$ cd ..

micha@mrosen-win1 MINGW64 ~/dev/CalMAN/src/CalMAN/calman 5 (master)
$ cd "CalMAN App"/

micha@mrosen-win1 MINGW64 ~/dev/CalMAN/src/CalMAN/calman 5/CalMAN App (master)
$ git log .
commit 41d026ddf3282227932136245092aaabace4aded
...


0

简而言之:检查是否有其他正在运行的git客户端。

我遇到了类似的问题:git没有任何输出。

git statusgit loggit fetch:都是一样的。什么也没有。一个空行然后回到命令提示符。

只有当我在父目录中(不是存储库)或在另一个存储库中时,才会得到响应。 此外,我还会收到错误和有关误输入命令的建议。所以它并不完全死亡。只是处于休眠状态 - 或者其他什么原因。

我找到的第一个响应是 git branches,它正确地打印了已知的分支。所以我尝试了一下分支,并使用了 git checkout master,但什么也没有改变,上述所有命令都没有变化。什么也没有。当我尝试切换回 develop 时,我得到了一个线索:

fatal: Unable to create 'I:/foo/bar/repo/.git/index.lock': File exists.

Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.

我发现一个运行的 git-UI-客户端(在我的情况下是 GitKraken)并关闭它。问题解决了。 也许问题与我的存储库位于 Windows 网络共享上有关。


现在这个问题有三种可能的诊断 :) - Chris
我没有遇到相同的问题,但是类似的情况出现了。git status 可以正常工作,但是 git log 却不能。重新启动我的会话解决了这个问题,可能是其他正在运行的 git 进程导致了这个问题。 - Burak Karasoy

0

我在Windows的最深层文件夹中执行了git log,但它没有起作用。所以我尝试了git ls-files,但它也没有起作用。

我一直向上跳转到足够高的文件夹,直到git ls-files起作用,然后使用相对文件路径来运行git log

不知道是什么原因导致这种情况,但这暂时解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接