我们计划将我们最后一个大型CVS存储库迁移到Git存储库中。
对于迁移,我们使用svn2git' s css2git。因为这个CVS存储库已经增长了大约12年,所以它有31GB的数据。
我无法找到任何解决方案来删除超过指定时间段(例如2年)的所有历史记录。
你知道其中任何一个的工具/命令/解决方案吗?:
谢谢和问候, 安德烈亚斯
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
答案 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中或在迁移期间更容易和更安全。
grafts
文件中设置新的根提交:echo %commit_hash% >.git/info/grafts
git tag --contains
和git branch --contains
)git filter-branch --tag-name-filter cat -- --all
或者,您也可以解析git-dump.dat
文件(以git快速导入格式输出cvs2git)并从那里删除旧的提交,标签和分支。