在我当前的存储库中,我已~80
提交和3
发布/代码(v0.1
,{ {1}},v0.2
)。
是否有办法将存储库更改为仅在一次提交中保留三个版本以及两个后续版本之间的所有更改。
因此,我希望v0.3
。
对于未来,我找到了分支机构的方法,但我不知道如何最好地改变git历史。
答案 0 :(得分:0)
是的,这很容易实现。
没有任何花哨的重写,变基,挤压,你可以这样做(假设您现有的本地存储库位于$REPOS1
且路径$REPOS2
尚不存在:
git init $REPOS2
for $TAG in v0.1 v0.2 v0.3 v0.4 ; do
cd $REPOS1
git checkout $TAG
rm -rf $REPOS2/* # Assuming there are no files/dirs starting with "." except ".git", which we skip
cp -r * $REPOS2/
cd $REPOS2
git add -A ; git commit -m "$TAG" ; git tag "$TAG"
done
这可能看起来很幼稚,但它确实很有效,因为git
在添加/提交时只考虑文件的内容(和模式),并且它会自动检测文件是否存在两个操作之间保持相同。它将重新使用现有的对象,你将得到一个完美的"差异"最后。
在rm
和cp
步骤中,您希望a)删除$REPOS2
除$REPOS2/.git
树之外的所有内容,然后从$REPOS1
复制所有内容除了$REPOS2
树之外的$REPOS1/.git
。如果您确实有其他文件/目录以.
开头,那么您需要根据需要修改这些命令(可能使用find
或tar --exclude
或您能想到的任何内容)。
如果最后您希望保留此清理过的历史记录,请丢弃$REPOS1
并继续$REPOS2
。但是,如果您想保留原始历史记录,请将两者合并在一起:
cd $REPOS2
git remote add $REPOS1 repos1
git fetch repos1
for $TAG in master v0.1 v0.2 v0.3 v0.4 ; do
git tag old-$TAG repos1/$TAG
done
git remote del repos1
(假设您从未在$REPOS1
中分支。)在此之后,$REPOS2
也将包含以old-
开头的标记中的所有旧历史记录。你现在可以抛弃$REPOS1
。