force - git stash pop que hace
git stash reporting: '''' no es una referencia de stash (3)
No estoy seguro de lo que pasó, pero parece que el git stash está en un mal lugar.
% git stash list
stash@{0}: filter-branch: rewrite
stash@{1}: filter-branch: rewrite
stash@{2}: On mysolr: start mysolr stuff
Está bien, y git show stash@{0}
funciona bien. Pero:
% 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
He usado git stash un montón en el pasado y no he encontrado esto. Recientemente había reescrito el historial para eliminar un archivo del historial antes de publicarlo en github. El comando que corrí entonces fue
git filter-branch --force --index-filter /
''git rm --cached --ignore-unmatch FILENAME'' /
--prune-empty --tag-name-filter cat -- --all
¿Alguna idea de cómo arreglar el alijo?
Creo que filter-branch
ha roto tus escondites. Si el argumento de git stash
no se parece lo suficiente a una bolsa de escondite , not a stash reference
queja de not a stash reference
.
Tenga en cuenta que git show stashref
utiliza el antiguo git show
, que no requiere que una confirmación dada como argumento se asemeje a un alijo. Si git stash show
falla de la misma manera que los otros comandos de git stash
, o si el examen manual del alijo en cuestión muestra que ya no es un commit de combinación de dos o tres padres, entonces este es el caso.
Probablemente fue el --prune-empty
que lo hizo aquí. Si no hubiera add
nada en el momento del alijo, el índice de confirmación estaría vacío. En general, es probable que sea más inteligente evitar filtrar referencias de alijo.
Puedes probar dos enfoques diferentes:
- Recupere el alijo original SHA-1 (s) de
refs/original/
(dondefilter-branch
dejó lafilter-branch
) y / o los reflogs; utilícelas para reconstruirrefs/stash
y / o los reflogs de stash, o úselos directamente y luego presione la ref de stash y su reflog. - Utilice solo las confirmaciones de árbol de trabajo restantes en los escondites reescritos. Todo lo que realmente necesita, ya que las confirmaciones de índice estaban vacías, es esa única confirmación de árbol de trabajo. Puedes obtener un parche usando el comando
git show
que ya has ejecutado.
(Para obtener más información sobre las bolsas de alijo y de alijo, incluida la forma de tres padres utilizada con --untracked
o - sin --untracked
, consulte ¿Cómo recuperarse de “guardar el gash con el alijo --todos”? ).
Suponiendo que haya recuperado su contenido y desea eliminar por completo la referencia de stash
, esto lo hará. Tenga en cuenta que esta es la opción de "atacar desde la órbita" ; no lo haga hasta que esté seguro de que está listo:
git update-ref -d refs/stash
No tienes que destruir todos tus escondites. Puedes eliminar solo los rotos manualmente usando git reflog
. En tu caso:
git reflog delete --rewrite stash@{1}
git reflog delete --rewrite stash@{0}
(Las puse en orden inverso aquí porque cada eliminación disminuye la numeración de las siguientes entradas. En la práctica, no se moleste en hacer los cálculos mentalmente, simplemente haga una git stash list
después de cada eliminación para obtener una lista actualizada y seleccione otra entrada rota restante a partir de ese.)
todas las respuestas anteriores no funcionan para mí, el comando a continuación funciona, puede eliminar un alijo que desee. Espero que funcione para usted.
```
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}
```