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



我在全局配置中设置了rebase.autostash=true,能够重新建立一个脏的工作树的基础是很好的,但似乎没有--index选项可以让自动操作重新存储我以前阶段的更改,就像通过git apply/pop --index <StashID>手动隐藏和弹出时一样。相反,在重新定基和自动停止之后,所有更改现在都不记录。

有没有办法将--index添加到自动tashing中?

否。代码对当前rebase实现中的apply命令进行硬编码:

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

尝试使用pre-rebasepost-rewrite挂钩手动执行自动塔什失败的原因有两个:

  • 如果autotash被禁用并且有未提交的更改,rebase将提前中止,并且pre-rebase钩子永远不会被调用
  • 如果启用了autostash,则pre-rebase挂钩会在本地更改已经重置后运行,因此没有什么可隐藏的了

不幸的是,自动存储机制内部使用git stash create创建未记录的存储提交,并且仅在应用失败时(使用git stash store <hash>(将其存储到常规存储列表中。因此,也没有自动的方法来找到要在post-rewrite钩子内重新应用git stash apply --index的autostash提交。

但是,autostash的shorthash会打印到控制台。有了这些步骤,它可以手动重新应用:

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

通过将该过程包装在以autostash哈希为参数的git别名中,可以使其更加愉快:

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

这使得命令git reapply <autostash-hash>可用。它使用git stash序列,应用autostash,git stash drop而不是git reset --hard,使意外运行更容易恢复。它还使用了将^0添加到哈希中的技巧,避免了将其解释为隐藏号,就像autostash代码对其apply调用所做的那样。

相关内容

  • 没有找到相关文章