添加新存储时如何保持Git存储索引不变

时间:2018-06-19 18:04:03

标签: git

假设我的分支有两个存储区。

当我保存另一个存储时,存储索引将更改。 0变成1,1变成2,新的存储设置为0。

添加新存储时是否可以保持存储索引不变?谢谢

2 个答案:

答案 0 :(得分:3)

不,这是不可能的。

使用git stash create 而不运行随后的git stash store,您可以稍微接近一点。然后,您必须创建一个 other 名称来保存隐藏提交(记住,git stash进行提交,就像git commit!),以免打扰refs/stash参考或其任何reflog条目。

git stash apply命令接受任何指向“类似存储”的提交的引用。 git stash create创建的任何提交当然都非常隐蔽,因为它 是隐蔽提交。

作为一个非常粗糙的例子:

hash=$(git stash create)
if [ "$hash" == "" ]; then
    echo "nothing to save!"
else
    git update-ref refs/private-stash $hash
    echo "new private-stash created"
fi

及更高版本:

git stash apply refs/private-stash
git update-ref -d refs/private-stash

答案 1 :(得分:1)

这将需要大量脚本。在实践中,我第二次回答了托雷克的问题(“否”),但是为了完整起见,这是您必须要做的:

首先,您需要记下当前存储reflog指向的所有提交ID及其主题消息。您应该在创建新存储之前执行此操作。 (如果已经创建了存储,那么整个混乱情况就比较混乱了。)一种实现方法是

git reflog stash --format=%h %gs

实际上,您要做的是将这些记录在某处,以备将来参考。一种“足够简单”的方法是

git reflog stash --format='-m "%gs" %h' |xargs -n 3 git update-ref --create-reflog temp_stash

temp-stash reflog相比,stash reflog中的条目将被反转,但是很快就会出来。

现在temp_stash正在跟踪存储条目,您需要清除存储引用及其刷新日志。

git update-ref -d refs/stash

现在,您可以创建新的存储。

git stash

,然后从temp_stash中拉回存储的reflog条目

git reflog temp_stash --format='-m "%gs" %h' |xargs -n 3 git update-ref --create-reflog refs/stash

再次反转reflog条目的顺序,因此reflog被“按顺序”放回去,并且您创建的新存储被推到末尾。