首页 > 解决方案 > Git:删除损坏的存储

问题描述

我有一个破损的藏匿处:

% git stash drop            
fatal: log for refs/stash is empty
% cat .git/logs/refs/stash
%

但是,它确实出现在git log --all

% lal

*   f32cdce - (HEAD -> develop, origin/develop) (44 minutes ago) <Williams, Ken>
|\  
| * 05cc7d3 - (3 weeks ago) <Ken Williams>
| * 6d9c8ae - (3 weeks ago) <Ken Williams>
| | * 3fb311d - (refs/stash) (3 weeks ago) <Ken Williams>
| |/| 
| | * 19be16e - (3 weeks ago) <Ken Williams>
| |/  
| * ffea5e2 - (i2) (9 weeks ago) <Ken Williams>

lal是我的别名git log --graph --pretty=format:'%h -%C(yellow)%d%Creset %Cgreen(%ad) %C(bold blue)<%an>%Creset' --all。)

我做了一个git stash apply 3fb311d,所以我得到了存储的内容。现在,我怎样才能将refs/stash从树上移除,这样它就不会一直抱怨?

编辑

即使refs/stash按照@mark-adelsberger 的建议删除了引用,提交也会显示在历史列表中:

% lal

*   f32cdce - (HEAD -> develop, origin/develop) (31 hours ago) <Williams, Ken>
|\  
| * 05cc7d3 - (3 weeks ago) <Ken Williams>
| * 6d9c8ae - (3 weeks ago) <Ken Williams>
| | * 3fb311d - (3 weeks ago) <Ken Williams>
| |/| 
| | * 19be16e - (3 weeks ago) <Ken Williams>
| |/  
| * ffea5e2 - (i2) (9 weeks ago) <Ken Williams>
| * 199af47 - (9 weeks ago) <Ken Williams>
...

这是在 OS X 10.15.7 上使用 Git 2.29.0(自制软件)。

标签: gitgit-stash

解决方案


更新- 根据已编辑的问题在末尾添加注释


如果.git/refs/stash为空(或不存在)但 git log 显示 a refs/stash,那么我会怀疑stashref 以packed-refs某种方式添加到您的文件中。

您可以确认 ref 的存在(无论它在磁盘上的表示形式)与

git for-each-ref refs/stash

如果这显示refs/stash(我认为它会),那么你可以删除 ref

git update-ref -d refs/stash

提醒一下,这是一个潜在的破坏性命令;在特定情况下,您知道您已经保存了对该数据的引用,或者不再需要它,那很好。


所以我不清楚什么会导致日志报告似乎无法访问的提交(基于图表和该特定提交上缺少引用名)。如果我在那个州有一个回购,我想我可以弄清楚发生了什么,但我真的不知道如何重现这种症状。

我最好的建议是做

git for-each-ref |grep 3fb311d

查看是否由于某种原因没有在日志中命名 ref。如果什么都没有显示,另一个想法就是

git for-each-ref

或者看看有没有

git fsck

告诉你任何有用的东西。如果其中任何一个出现更多信息,我将很乐意查看并更新更多建议。


推荐阅读