1

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

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

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

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

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

谢谢和问候,安德烈亚斯

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

#!/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
4

1 回答 1

2

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

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

二进制文件

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

标签数量

我们在 CVS 存储库中有超过 20k 的构建标签。由于标签数量如此之多,Git Extensions 和 Source Tree 的工作速度都非常慢(尤其是当他们需要将所有标签加载到下拉列表中时)。由于在 Git 2.3.0 中修复git push了性能回归,使用 Git 1.9.5 也很慢。目前在 Git 中,我们只保留最近 2 年的构建标签(约 7k 个标签),定期归档旧标签。

丢弃旧历史

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

  1. 在文件中设置新的根提交graftsecho %commit_hash% >.git/info/grafts
  2. 删除所有不包含该提交的标签和分支(参见git tag --containsgit branch --contains
  3. 重写提交图:git filter-branch --tag-name-filter cat -- --all

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

于 2015-10-22T10:38:56.680 回答