web-dev-qa-db-ja.com

git stashレポート: ''はstashリファレンスではありません

何が起こったのかよくわかりませんが、gitstashは悪い場所にあるようです。

% git stash list
stash@{0}: filter-branch: rewrite
stash@{1}: filter-branch: rewrite
stash@{2}: On mysolr: start mysolr stuff

大丈夫です、そしてgit show stash@{0} 正常に動作します。だが:

% git stash drop
'' is not a stash reference
% git stash pop
'' is not a stash reference
% git stash drop stash@{0}
'stash@{0}' is not a stash reference

私は過去にgitstashをたくさん使用しましたが、これに遭遇することはありません。最近、履歴を書き直して、githubに公開する前に履歴からファイルを削除しました。私が実行したコマンドは

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch FILENAME' \
  --Prune-empty --tag-name-filter cat -- --all

隠し場所を修正する方法はありますか?

25
Hamish Downer

filter-branchがあなたの隠し場所を壊したと思います。 git stashへの引数が スタッシュバッグ に十分に似ていない場合は、not a stash referenceの苦情があります。

git show stashrefはプレーンな古いgit showを使用していることに注意してください。これは、引数として指定されたコミットが隠し場所に似ている必要はありません。 git stash showが他のgit stashコマンドと同じように失敗した場合、または問題の隠し場所を手動で調べた結果、2親または3親のマージコミットではなくなったことが示された場合、これは実際には場合。

ここでそれを行ったのはおそらく--Prune-emptyでした。スタッシュの時点で何もaddしていない場合、インデックスのコミットは空になります。一般に、スタッシュ参照のフィルタリングを避ける方がおそらく賢明です。

2つの異なるアプローチを試すことができます。

  • 元のスタッシュSHA-1をrefs/original/filter-branchが残した場所)および/またはreflogから回復します。それらを使用してrefs/stashおよび/またはstashreflogを再構築するか、それらを直接使用してからstashrefとそのreflogを上書きします。
  • 書き換えられたスタッシュの残りのワークツリーコミットのみを使用します。インデックスのコミットが空だったので、本当に必要なのは、1つのワークツリーのコミットだけです。すでに実行したgit showコマンドを使用してパッチを取得できます。

--allまたは--untrackedで使用される3つの親フォームを含む、スタッシュバッグとスタッシュバッグの詳細については、 「gitstashsave-から回復する方法」を参照してください。 -すべて」?

コンテンツを取り戻し、stash参照を完全に消去したい場合は、これで問題ありません。これは "nuke it from orbit" オプションであることに注意してください。準備ができていることを確認するまでは実行しないでください。

git update-ref -d refs/stash
25
torek

すべての隠し場所を破壊する必要はありません。 git reflogを使用して、壊れたものだけを手動で削除できます。あなたの場合:

git reflog delete --rewrite stash@{1}
git reflog delete --rewrite stash@{0}

(ここでは、削除するたびに次のエントリの番号が減るので、これらを逆の順序で並べます。実際には、精神的に計算する必要はありません。削除するたびにgit stash listを実行して、更新されたリストを取得し、残りのリストを選択してください。それから壊れたエントリ。)

5

上記のすべての答えは私には機能しません、以下のコマンドは機能します、それはあなたが望む1つの隠し場所を削除することができます。私はそれがあなたのために働くことを願っています。

```
git stash list

//--- apply target stash
git stash apply refs/stash@{n} 

//---- delete target stash
git stash drop --index n
// or
git stash drop refs/stash@{n}
```
1
Zero.D.Saber