我在全局配置中设置了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-rebase
和post-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调用所做的那样。