不响应的git状态、差异和添加(挂起)

34
下面的 Git 命令在我的其中一个存储库中挂起(无响应):
git status
git diff
git stash
git add

我无法运行 git add 命令,这让我认为问题不仅仅是因为文件过大而导致的不响应。由于 git stash 命令也卡住了,我认为这不仅仅是与远程仓库通信的问题。

git remote show origin 命令显示了预期的远程 URL。我正在一个分支上工作,并检查它没有被重命名。(顺便提一下,该远程仓库托管在 bitbucket 上。)

在另一个仓库中,以上所有命令都可以正常使用,因此这不是因为网络连接问题。

您有其他解决此问题的建议吗?


4
GIT_TRACE=1 GIT_CURL_VERBOSE=2 git status 显示什么?你尝试过 git -vvv 吗? - jojek
2
如果您正在使用Windows操作系统,请检查是否有一些Windows进程锁定了该存储库中的某个文件或多个文件。如果是这样,您的git命令将等待其他进程释放锁,然后再继续进行。如果那个进程永远不释放,Git将永远无法继续进行。 - torek
2
它在15分钟左右之后做出了响应,并且现在立即回应,毫不拖延。可能有一些文件被锁定了,就像@torek所建议的那样。@torek,我正在使用Ubuntu 16.04,有什么办法可以检查被锁定的文件吗?@jojek,git -vvv返回“未知选项”。我正在使用git 2.7.4版本。您的其他建议现在返回与git status相同... - yunque
Linux不会强制锁定不愿意的程序,因此Windows的情况并不适用。但是,听起来好像某个文件由于某种原因被延迟访问了很长时间。Linux支持许多种文件系统,包括网络和集群非本地文件,这些文件可能会被任意长时间延迟(基本上是等待某个服务器响应);也许在这里发生了这种情况。如果没有访问该系统,很难说更多的内容。 - torek
3
请执行 git fsck 命令以验证您的代码库完整性。 - Lasse V. Karlsen
8个回答

21
无论价值如何,尝试执行git fsck(根据其中一条评论)然后执行git gc。当运行git statusgit commit时,它们在处理一些文件后一直卡住,而运行这些命令解决了问题。我不知道哪个命令实际上解决了问题。

2
git gc 在我的情况下非常有帮助。我认为 fsck 没有做任何事情,因为没有损坏的文件。gc 似乎做了很多清理工作:https://www.atlassian.com/git/tutorials/git-gc - wordsforthewise
请注意,git gc代表“Git垃圾回收”,它会删除git fsck报告的所有“悬空提交”和“悬空blob”。此外,对于任何想知道的人,虽然git fsck花了我45分钟,但git gc只花了3分钟。 - Gabriel Staples
现在我已经运行了这两个命令,git status现在只需要0.9秒就能运行完毕(可以用time git status来测试时间),而不是似乎永远都被冻结住。 - Gabriel Staples
是时候接受这个惊人的、拯救生命的答案了吗? :D - dnl-blkv
git fsck 也卡住了 :( - Jason Cheng
显示剩余3条评论

6
它大约在15分钟后作出了回应,现在能够立即做出反应而没有延迟。
使用Git 2.20(2018年第四季度),您至少可以检查git status正在执行某些操作(而不仅仅是挂起):当刷新索引需要很长时间时,它学会了显示进度条

请看提交ae9af12 (2018年9月15日) 由 Nguyễn Thái Ngọc Duy (pclouds) 提交。
(由 Junio C Hamano -- gitster --提交4d87b38 中合并, 2018年10月19日)

status: 如果刷新索引需要太长时间,则显示进度条

刷新索引通常非常快,但有时仍可能需要很长时间。

  • Cold cache是其中之一。
  • 或将存储库复制到新位置(*)。

显示一些内容可以让用户知道"git status"没有挂起,只是在忙于某些操作。

(*) 在这种情况下,索引中的所有状态信息都变得无效,git会回退到重新计算所有文件内容的哈希值,以查看是否有任何更新的状态信息。这相当昂贵。即使是像git.git这样小的存储库,也需要3秒钟。


4

执行git fsck命令。在我的情况下,它解决了问题。


4

对于新手而言,我遇到的问题是在 git add 时卡住了——我忘记进行过 pg_dumps 操作,然后把一些大文件留在了目录中。我将它们移动到了不同的目录下,问题就解决了。


3

Git 可能正在构建未跟踪文件的索引。在向新克隆的存储库添加数千个新文件后,git status 命令似乎会挂起超过 2 分钟,然后才会响应:

It took 139.67 seconds to enumerate untracked files. 'status -uno'
may speed it up, but you have to be careful not to forget to add
new files yourself (see 'git help status').

如果你有类似的情况,考虑将未被跟踪的文件移出仓库,确认 git status 再次响应。

2
在我的情况下,重启计算机有所帮助。

1
我发现我的问题是因为我从.gitignore文件中删除了/node_module。在之前的添加中,它是存在的,所以一旦我重新添加了/node_module,git就开始正常工作了。

0
我发现我的是:
[status]
    submodulesummary = 1

~/.gitconfig文件中注释掉submodulesummary = 1配置后,git status运行速度更快。


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