【问题标题】:git stash exits 0 but no stash createdgit stash 退出 0 但没有创建 stash
【发布时间】:2019-03-05 05:33:23
【问题描述】:

有人建议我使用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

【问题讨论】:

    标签: git git-pull git-stash


    【解决方案1】:

    对于脚本,使用git stash create(它会在标准输出中生成已创建存储的哈希 ID,如果没有创建存储,则在标准输出中不生成任何内容)。然后,您可以使用git stash store 将创建的存储插入为stash@{0},当且仅当实际创建一个时。

    如果您的 Git 太旧而无法使用 git stash create,您可以在运行 refs/stash 之前和之后在 refs/stash 上运行两个 git rev-parse 命令。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

    【讨论】:

      【解决方案2】:

      此答案不能回答您如何存储空更改,但它应该可以解决您的问题。

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

      【讨论】:

      • 您还需要git diff-files:diff-index 比较索引但不查看工作树,而git stash 创建一个存储(两个提交,一个用于索引,一个用于工作树)如果索引 工作树是脏的。
      • @Torek 为什么不[ -z "$(git status -uno --porcelain)" ] && echo clean
      • @TomHale:这可能就足够了,因为你不关心哪个是脏的(索引、工作树或两者兼而有之),只关心是否至少有一个。
      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 2017-11-24
      • 2023-02-08
      • 2017-11-25
      • 2013-02-23
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多