2014-02-27 6 views
16

Nicht ganz sicher, was passiert ist, aber Git Stash scheint an einem schlechten Ort zu sein.Git Stash-Bericht: '' ist kein Versteck Referenz

% git stash list 
[email protected]{0}: filter-branch: rewrite 
[email protected]{1}: filter-branch: rewrite 
[email protected]{2}: On mysolr: start mysolr stuff 

ist OK und git show [email protected]{0} funktioniert gut. Aber:

Ich habe git Stash viel in der Vergangenheit und nicht über diese. Ich hatte kürzlich den Verlauf neu geschrieben, um eine Datei aus dem Verlauf zu entfernen, bevor sie in github veröffentlicht wurde. Der Befehl lief ich war dann

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

Irgendwelche Ideen, wie man das Versteck beheben?

+0

Das hätte funktionieren sollen, sieht 'git reflog stash' gut aus? –

+0

@ VlastimilOvčáčík: Ja 'git reflog stash' sah gut aus. –

Antwort

16

Ich denke, filter-branch hat Ihre Verstecke gebrochen. Wenn das Argument git stash nicht ausreichend ähnelt stash bag, erhalten Sie diese not a stash reference Beschwerde.

Beachten Sie, dass git show stashref einfache alte git show verwendet, die nicht erfordert, dass ein als Argument übergebenes Commit einem Stash ähnelt. Wenn git stash show auf die gleiche Weise wie die anderen git stash Befehle fehlschlägt, oder wenn die manuelle Überprüfung des fraglichen Speichers zeigt, dass es nicht länger ein Merge Commit mit zwei oder drei Parents ist, dann ist dies tatsächlich der Fall.

Es war wahrscheinlich die --prune-empty, die es hier getan hat. Wenn Sie zum Zeitpunkt des Stash nichts add ed haben, wäre der Index-Commits leer. Im Allgemeinen ist es wahrscheinlich klüger, Filterreferenzen nicht zu filtern.

Sie können zwei verschiedene Ansätze versuchen:

  • Wiederherstellen der ursprünglichen Vorrat SHA-1 (e) von refs/original/ (wo filter-branch sie links) und/oder reflogs; Verwenden Sie diese, um refs/stash und/oder die Stash Reflogs neu zu erstellen, oder verwenden Sie sie direkt und dann clobber die Stash Ref und ihre Reflog.
  • Verwenden Sie nur die verbleibenden Work-Tree-Commits in den neu geschriebenen Stashes. Alles was Sie wirklich brauchen, da die Index-Commits leer waren, ist dieser eine Work-Tree-Commit. Sie können einen Patch mit dem Befehl git show erhalten, den Sie bereits ausgeführt haben.

(Für ein bisschen mehr auf Vorrat und Stash Taschen, einschließlich der Form drei Eltern verwendet mit --all oder --untracked finden How to recover from “git stash save --all”?.)

Sie haben Angenommen, Ihre Inhalte zurück und wünschen bekommen die auszulöschen stash Referenz ganz, das wird es tun. Beachten Sie, dass dies die "nuke it from orbit" Option-nicht es tun, bis Sie sicher sind, sind Sie bereit:

git update-ref -d refs/stash 
+2

Danke dafür. Ich habe es geschafft, Commits von 'git reflog stash' zu bekommen und dann habe ich' git stash apply stash @ {2} 'geschafft. Sobald ich mich verpflichtete, benutzte ich die Atombombe-Option und ich bin wieder glücklich. Vielen Dank. –

+0

'git update-ref -d refs/stash' ist genau das, was ich brauchte, danke! – Chin

+1

Ein viel einfacherer 'Git Stash Clear' funktionierte für mich, auch wenn ich den gleichen Fehler hatte. –

1

Sie nicht alle Ihre stashes nuke müssen. Sie können nur die beschädigten manuell mit git reflog löschen. In Ihrem Fall:

git reflog delete --rewrite [email protected]{1} 
git reflog delete --rewrite [email protected]{0} 

(Ich habe diese in umgekehrter Reihenfolge hier, weil jede Löschung die Nummerierung der folgenden Einträge nimmt in der Praxis nicht die Mühe, die Mathematik geistig tun, nur tun git stash list nach jedem Löschvorgang zu erhalten. eine aktualisierte Liste und wählen Sie einen anderen verbleibenden gebrochenen Eintrag aus.)