如何只保留git历史记录中的版本

时间:2017-05-20 18:23:02

标签: git

在我当前的存储库中,我已~80 提交3 发布/代码v0.1,{ {1}},v0.2)。

是否有办法将存储库更改为仅在一次提交中保留三个版本以及两个后续版本之间的所有更改。 因此,我希望v0.3

对于未来,我找到了分支机构的方法,但我不知道如何最好地改变git历史。

1 个答案:

答案 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在添加/提交时只考虑文件的内容(和模式),并且它会自动检测文件是否存在两个操作之间保持相同。它将重新使用现有的对象,你将得到一个完美的"差异"最后。

rmcp步骤中,您希望a)删除$REPOS2$REPOS2/.git树之外的所有内容,然后从$REPOS1复制所有内容除了$REPOS2树之外的$REPOS1/.git。如果您确实有其他文件/目录以.开头,那么您需要根据需要修改这些命令(可能使用findtar --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