【问题标题】:Git: Remove broken stashGit:删除损坏的存储
【发布时间】:2020-11-09 17:37:58
【问题描述】:

我有一个破损的藏匿处:

% 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)&lt;%an&gt;%Creset' --all 的别名。)

我做了一个git stash apply 3fb311d,所以我已经得到了存储的内容。现在,我怎样才能从树中删除 refs/stash 使其不再抱怨?

编辑

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

% 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(自制软件)。

【问题讨论】:

  • rm .git/refs/stash ?
  • @matt 我没有.git/refs/stash 文件。我不确定存储信息的存储位置。
  • 我假设你也做过rm .git/logs/refs/stash?这两个命令一起吹走你的藏匿处。
  • @matt 这似乎不是真的,即使在删除了这两个文件之后(find .git | grep stash 什么也不返回),隐藏在git lg --all 中是可见的。
  • 问题不在于git lg --all 中显示的内容。您要求我们解决的是git stash drop barfs。如果你按照我的建议去做,并且停止吐槽,我的工作就完成了! :)

标签: git git-stash


【解决方案1】:

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


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

您可以使用

确认 ref 的存在(无论其在磁盘上的表示形式如何)
git for-each-ref refs/stash

如果这显示refs/stash(我想它会这样),那么你可以删除引用

git update-ref -d refs/stash

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


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

我最好的建议是这样做

git for-each-ref |grep 3fb311d

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

git for-each-ref

或者看看

git fsck

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

【讨论】:

  • 谢谢马克,git for-each-ref refs/stash 确实给了我一个哈希值(以3fb311d 开头,所以它与我的日志输出一致)。我用update-ref 删除了它,但它仍然在我的git lg --all 输出中显示(没有参考名称)。为什么它仍然会出现,没有命名引用?
  • @KenWilliams 生成输出时是否已签出 3fb311d 提交?如果它没有显示任何命名的 ref,并且它没有任何导致命名 ref 的子代,并且它没有被检出,那么我想不出它会出现在日志输出中的原因
  • 不,3fb311d 没有被签出,就像我在原始问题中显示的那样,它出现在树的一侧,但现在没有 refs/stash 名称 - 我会添加对问题进行编辑以显示这一点。
  • @KenWilliams - 听起来你有一个处于不寻常状态的回购。我不知道如何重现它;添加了一些你可以尝试的暗中想法,以收集更多信息
  • 感谢您的坚持!我确实通过git for-each-ref |grep 3fb311d3fb311d7a9b1fb7d0d394ad723747b23d83f3ce9 commit refs/replace/da1018741f5cea52e4b139d8f0ca93f4d1c3d12c 找到了refs/replace 参考。当然不是我自己创造的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2012-01-06
  • 2013-09-11
  • 1970-01-01
  • 2015-04-09
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多