2

我有一个使用 git-svn 从 SVN 迁移的 Git 存储库。我曾经git svn fetch从 SVN 获得最新的提交。我想将 repo 推送到 GitHub,但是历史记录中有一些大于 100 MB 的文件我必须删除,所以我使用bfg repo clean来删除它们。

$ java -jar bfg-1.12.14.jar --strip-blobs-bigger-than 100M
...
In total, 10235 object ids were changed. Full details are logged here:
...
BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
...
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
Counting objects: 204963, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (171827/171827), done.
Writing objects: 100% (204963/204963), done.
Total 204963 (delta 91547), reused 106805 (delta 0)

$ git svn fetch -A authors-transform.txt
fatal: Invalid revision range b156a7b66be002c3bf38987ea503f5c852146343 
rev-list --pretty=raw --reverse b156a7b66be002c3bf38987ea503f5c852146343..refs/remotes/git-svn --: command returned error: 128

如何在不重新初始化整个存储库的情况下使其工作,因为我不希望这些文件再次出现在历史记录中(它们超出了 GitHub 的限制)?有什么方法可以重新计算哈希或让它忽略不匹配?

4

2 回答 2

1

虽然git-svn提供了相当不错的 Subversion 到 Git 的镜像支持,但您无法将其与 BFG 等历史重写清理工具结合使用。

如果您需要清理存储库,您应该考虑完成从 Subversion 到 Git 的迁移,编写转换和迁移脚本,并迁移到 Git-first 提交并放弃 Subversion 存储库,此时您不会不在乎git-svn了。你会发现清理 Subversion 历史非常困难,并且不可能将清理过的 Subversion 和 BFG 清理过的 Git 相互关联。正如您已经观察到的那样,git-svn不会容忍重写。

将 BFG 清理计划为一次性练习,针对正在进行的git-svn提取编写脚本和测试,但一旦运行,完全停止使用 Subversion,只使用 Git。

于 2016-11-11T13:56:44.493 回答
1

在做了与你类似的事情之后(用 克隆一个 svn repo git svn clone --prefix=svn/ ...)然后运行

> bfg --strip-blobs-bigger-than 20M
> git reflog expire --expire=now --all && git gc --prune=now --aggressive

要从我的 repo 中删除大文件,我发现我也无法使用 agit svn fetch或 a从 svn repo 更新git svn rebase。起初我遇到了与修订范围相关的错误,然后我遇到了与丢失或无效对象相关的错误。为了解决这个问题,我必须删除.revmap.*文件以及本地和远程分支上的索引,然后重新生成它们。为我解决问题的完整命令集是:

> git fsck --full
> git prune
> rm .git/svn/refs/remotes/svn/trunk/.rev_map.*
> rm .git/index
> rm .git/svn/refs/remotes/svn/trunk/index
> git svn rebase

我不知道我为未来释放了什么样的龙,但我的回购似乎现在可以工作了。我可以成功地将新的 svn 更新拉到我的 git 存储库中,并将它们合并到本地的其他分支中。

请注意,我不会通过 git 推回 svn,所以我不知道这是否会导致问题。相反,我保留了一个“svn”分支,其中包含从 svn 存储库中提取的纯副本,并且我在分支“master”上的 git 本地工作。然后我使用命令行 svn 从“master”推送更改,将它们拉回我的“svn”分支,然后将它们合并回“master”。

于 2017-03-31T21:57:37.453 回答