在cvs2git Migration上删除早于x的历史记录

时间:2015-10-22 08:04:36

标签: git cvs svn2git cvs2git

我们计划将我们最后一个大型CVS存储库迁移到Git存储库中。

对于迁移,我们使用svn2git' s css2git。因为这个CVS存储库已经增长了大约12年,所以它有31GB的数据。

我无法找到任何解决方案来删除超过指定时间段(例如2年)的所有历史记录。

你知道其中任何一个的工具/命令/解决方案吗?:

     
  • 从CVS中删除历史记录
  •  
  • 不要使用cvs2git
  • 导出所有历史记录  
  • 不要使用Git import导入所有历史记录
  •  
  • 从Git中删除历史记录

谢谢和问候, 安德烈亚斯

Dmitry Oksenchuk建议的解决方案: 在编辑了移植物之后,我写了一个BASH脚本来清理混乱的标签和分支:

#!/bin/bash

NEW_ROOT_REF=$1
git tag --contains $NEW_ROOT_REF | sort  > TAGS_TO_KEEP.tmp
echo "Keep Tags:"
cat TAGS_TO_KEEP.tmp | wc -w

git branch --contains $NEW_ROOT_REF | sort  > BRANCHES_TO_KEEP.tmp
echo "Keep Branches:"
cat BRANCHES_TO_KEEP.tmp | wc -w

git tag -l | sort > TAGS_ALL.tmp
echo "All Tags:"
cat TAGS_ALL.tmp | wc -w

git branch -l | sort > BRANCHES_ALL.tmp
echo "All Branchess:"
cat BRANCHES_ALL.tmp | wc -w

# Remove tags
COUNTER=0
for drop in `comm TAGS_ALL.tmp TAGS_TO_KEEP.tmp -23`; do
        git tag -d $drop
        COUNTER=$[$COUNTER +1]
done
echo "Dropped tags: $COUNTER"

# Remove branches
COUNTER=0
for drop in `comm BRANCHES_ALL.tmp BRANCHES_TO_KEEP.tmp -23`; do
        git branch -D $drop
        COUNTER=$[$COUNTER +1]
done
echo "Dropped branches: $COUNTER"

# Clean up
rm TAGS_ALL.tmp TAGS_TO_KEEP.tmp BRANCHES_ALL.tmp BRANCHES_TO_KEEP.tmp

1 个答案:

答案 0 :(得分:2)

在格式良好的Git repo中,历史的深度通常不是问题。在linux repo中有超过500k的提交,它工作正常。今年我们将一个约15年的CVS回购(5GB ,v个文件)迁移到Git。 Git repo需要大约200MB并且包含~70k提交。

我们遇到了两个主要问题:二进制文件和标签数量。

二进制文件

在CVS中,二进制文件的所有修订都存储在服务器上,并且仅在结帐时传输当前修订。因此,在CVS中存储二进制文件根本不是问题,您只需要在服务器上有足够的磁盘空间。有了Git,情况就不同了。当您复制Git仓库时,二进制文件的所有修订都将传输到您的本地克隆。即使文件在最近的提交中不存在,其所有历史修订都在您的本地仓库中。我们设法通过从历史记录中删除不必要的二进制文件,将Git repo的大小从大约700MB缩小到大约200MB。这里重要的一点是根据Git而不是CVS来决定文件的大小。 Git使用zlib压缩和增量压缩来打包对象,因此同一文件的历史记录可以在Git和CVS中占用完全不同的磁盘空间。您可以使用"查找大文件" Git Extensions中的插件。

代码数量

我们在CVS回购中拥有超过20k的构建标记。有了这么多标签,Git Extensions和Source Tree的工作速度都非常慢(特别是当他们需要将所有标签加载到下拉列表中时)。由于Git 2.3.0中的性能回归fixed,使用Git 1.9.5的git push也非常慢。目前在Git中,我们仅保留最近2年(~7k标签)的构建标签,定期存档旧标签。

删除旧历史

如果您仍然需要它,那么在Git中丢弃旧历史比在CVS中或在迁移期间更容易和更安全。

  1. grafts文件中设置新的根提交:echo %commit_hash% >.git/info/grafts
  2. 删除所有不包含该提交的标记和分支(请参阅git tag --containsgit branch --contains
  3. 重写提交图:git filter-branch --tag-name-filter cat -- --all
  4. 或者,您也可以解析git-dump.dat文件(以git快速导入格式输出cvs2git)并从那里删除旧的提交,标签和分支。