Git отчет о записях: '' не является ссылкой на stash

Не совсем уверен, что произошло, но git stash, похоже, находится в плохом месте.

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

В порядке, а git show [email protected]{0} работает нормально. Но:

% git stash drop
'' is not a stash reference
% git stash pop
'' is not a stash reference
% git stash drop [email protected]{0}
'[email protected]{0}' is not a stash reference

В прошлом я использовал git stash много и не сталкивался с этим. Недавно я переписал историю, чтобы удалить файл из истории перед публикацией в github. Тогда я выполнил команду

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

Любые идеи, как исправить тайник?

Ответы

Ответ 1

Я думаю, что filter-branch сломал ваши приступы. Если аргумент git stash не похож на сумку , вы получаете жалобу not a stash reference.

Обратите внимание, что git show stashref использует простой старый git show, который не требует, чтобы коммит, данный как аргумент, напоминал приставку. Если git stash show терпит неудачу так же, как и другие команды git stash, или если ручное исследование рассматриваемого кошелька показывает, что он больше не выполняет слияние двух или трех родителей, это на самом деле так.

Вероятно, --prune-empty сделал это здесь. Если вы не указали add что-либо во время кошелька, фиксация индекса будет пустой. В общем случае, вероятно, разумнее избегать фильтрации ссылок на скрытие.

Вы можете попробовать два разных подхода:

  • Восстановите исходный штамп SHA-1 (s) из refs/original/ (где filter-branch оставил их) и/или reflogs; используйте те, которые нужно перестроить refs/stash и/или блокировки stash, или использовать их напрямую, а затем clobber stash ref и его reflog.
  • Используйте только оставшееся дерево работы в перезаписанных записях. Все, что вам действительно нужно, поскольку индекс совершает ошибку, это то, что одно дерево дерева совершает. Вы можете получить патч, используя команду git show, которую вы уже выполнили.

(Немного больше о мешках с записями и сумками, включая трехмерную форму, используемую с --all или --untracked, см. Как восстановить из "git stash save --all" ?.)

Предполагая, что вы вернули свое содержимое и хотите полностью стереть ссылку stash, это сделает это. Обратите внимание, что это параметр "nuke it from orbit" - не делайте этого, пока не убедитесь, что вы готовы:

git update-ref -d refs/stash

Ответ 2

Вам не нужно уничтожать все ваши приступы. Вы можете удалить только разбитые вручную, используя git reflog. В вашем случае:

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

(здесь я помещаю их в обратном порядке, потому что каждое удаление уменьшает нумерацию следующих записей. На практике не делайте математически мысленно, просто делайте git stash list после каждого удаления, чтобы получить обновленный список и выбрать другой оставшийся сломанный запись из этого.)