git stash退出0但未创建任何stash

时间:2018-09-29 12:51:15

标签: git git-pull git-stash

建议我使用avoid 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 :(得分:3)

对于脚本编写,请使用git stash create(在标准输出中生成所创建存储的哈希ID,如果未创建存储,则在标准输出中不生成哈希ID)。然后,只要且仅当实际创建一个存储时,您才能使用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

答案 1 :(得分:1)

此答案不能回答您如何进行空的更改,但可以解决您的问题。

首先检查是否有待处理的更改(请参见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)'