首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cvs2git迁移中删除早于x的历史记录

在cvs2git迁移中删除早于x的历史记录
EN

Stack Overflow用户
提问于 2015-10-22 08:04:36
回答 1查看 228关注 0票数 1

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

对于迁移,我们使用svn2git的cvs2git。因为这个CVS存储库已经增长了近12年,所以它拥有31 12的数据。

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

您知道其中一个工具/命令/解决方案吗?:

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

谢谢和问候,安德烈亚斯

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

代码语言:javascript
复制
#!/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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-22 10:38:56

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

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

二进制文件

在CVS中,二进制文件的所有修订都存储在服务器上,只有当前的修订在签出时被转移。所以在CVS中存储二进制文件一点问题都没有,您只需要在服务器上有足够的磁盘空间。吉特的情况就不一样了。当您对Git进行克隆时,二进制文件的所有修订都会转移到您的本地克隆中。即使一个文件在最近的提交中不存在,它的所有历史修订都在您的本地回购中。通过从历史记录中删除不需要的二进制文件,我们设法将Git的大小从大约700 by缩小到了~200 by。这里最重要的一点是,根据Git中文件的大小,而不是CVS中的文件大小来做出决定。Git使用zlib压缩和增量压缩来打包对象,因此同一个文件的历史可以在Git和CVS中占用完全不同的磁盘空间。您可以使用Git扩展名中的“查找大文件”插件。

标记数

我们在CVS回购系统中有超过20k的构建标签。对于这样数量的标记,Git扩展和源树的工作都非常缓慢(特别是当它们需要将所有标记加载到下拉列表中时)。由于Git 2.3.0中的性能回归固定,Git 1.9.5的git push也很慢。目前,在Git中,我们只保存最近两年的构建标记(~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

或者,您也可以解析git-dump.dat文件( git快速导入格式的cvs2git输出),并从那里删除旧的提交、标记和分支。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33276110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档