git - 使自动存储重新应用索引,就像 git 存储的 --index 选项一样

git - Make autostash reapply index, just like git stash's --index option

我在我的全局配置中设置了 rebase.autostash=true,能够重新设置脏工作树的基线很棒,但似乎没有 --index 选项来制作自动弹出窗口重新暂存我之前暂存的更改,就像您通过 git apply/pop --index <StashID> 手动存储和弹出时所做的那样。相反,在变基和自动弹出之后,所有更改现在都未暂存。

有没有办法将 --index 添加到自动存储?

没有。代码硬编码应用命令 in the current rebase implementation:

argv_array_pushl(&stash_apply.args,
     "stash", "apply", autostash.buf, NULL);

尝试使用 pre-rebase and post-rewrite 挂钩手动执行自动存储失败有两个原因:

  • 如果自动存储被禁用并且有未提交的更改,rebase 将提前中止并且 pre-rebase 挂钩永远不会被调用
  • 如果启用了自动存储,pre-rebase 挂钩会在本地更改已经重置后运行,因此没有任何东西可以存储

不幸的是,自动存储机制在内部使用 git stash create to create an unrecorded stash commit and only stores it to the regular stash list when the apply fails (using git stash store <hash>)。因此,也没有自动方法找到自动存储提交以在 post-rewrite 挂钩中使用 git stash apply --index 重新应用。

然而,自动存储的短哈希被打印到控制台。这样就可以通过以下步骤手动重新应用它:

  • 使用git reset --hard
  • 再次清除状态
  • 使用 git stash apply --index <shorthash>
  • 重新应用自动存储提交

将自动存储散列作为参数的 git alias 包装起来可以使该过程更愉快一些:

git config --global alias.reapply '![ ! -z "" ] && git stash && git stash apply --index "^0" && git stash drop || echo "usage: git reapply <autostash-hash>"'

这使得命令 git reapply <autostash-hash> 可用。它使用一系列 git stash、应用自动存储、git stash drop 而不是 git reset --hard 来使意外运行更容易恢复。它还使用了将 ^0 添加到散列的技巧,避免将其解释为隐藏编号 like the autostash code does for its apply call.