git stash выходит 0, но тайник не создан - PullRequest
0 голосов
/ 29 сентября 2018

Мне посоветовали избегать git pull --autostash и вместо этого использовать:

git alias.pull-autostash '!git stash push && git pull --rebase && git stash pop'

Когда нет изменений в индексе или рабочем дереве, выполните:

$ git stash push

дает:

No local changes to save

Дополнительная проблема заключается в том, что статус выхода 0.

Любой stash pop будет pop чем-то, что не являетсянажал.

Как заставить пустой тайник создать, как git commit --allow-empty?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Для сценариев используйте git stash create (который создает хэш-идентификатор созданного тайника на стандартном выходе или ничего на стандартном выводе, если тайник не был создан).Затем вы можете использовать git stash store, чтобы вставить созданный тайник как stash@{0}, если и только если он действительно был создан.

Если ваш Git слишком стар, чтобы иметь git stash create, вы можете запустить два git rev-parse команды на refs/stash до и после выполнения git stash save. 1 Они могут:

  • Обе команды не выполнены: тайник не был до и нет тайника после.
  • Первый сбой, второй успешный: раньше не было тайника, а теперь есть, значит, он был создан.
  • Оба успешно, с двумя выходными строками, совпадающими (без хранилища) или отличающимися (Создан тайник).

Таким образом, если вы используете --quiet --verify и фиксируете фактический вывод каждого из них, вы можете сказать, был ли создан тайник.То есть, здесь применяется фрагмент программирования:

old=$(git rev-parse --quiet --verify refs/stash)
git stash save || die ...
new=$(git rev-parse --quiet --verify refs/stash)
if [ "$old" != "$new" ]; then
    made_stash=true
else
    made_stash=false
fi
... do things ...
if $made_stash; then ... do things with the stash you made ...

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


1 Если вашему Git не хватает git stash create, он, вероятно, также предшествует git stash push и, следовательно, вам нужно git stash save.

0 голосов
/ 29 сентября 2018

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

Сначала проверьте, есть ли ожидающие изменения (см. https://stackoverflow.com/a/3879077/3526980)

$ git alias.pull-autostash '(git diff-index --quiet HEAD -- && git pull --rebase) || (git stash push && git pull --rebase && git stash pop)'
...