我在使用git-svn从SVN迁移时有一个Git repo。
我使用git svn fetch
来获取SVN的最新提交。我想将回购推送到GitHub,但历史上有一些文件大于100 MB that I had to remove,所以我使用bfg repo cleaner来摆脱它们。
$ 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的限制)?有没有办法重新计算哈希值或使其忽略不匹配?
答案 0 :(得分:1)
虽然git-svn
为Subit提供了相当不错的镜像支持,但是你无法将它与历史重写清理工具(如BFG)结合起来。
如果你需要清理存储库,你应该考虑完成Subversion-to-Git迁移,编写转换和迁移脚本,然后转移到Git-first提交并完全放弃Subversion存储库,此时你我不再关心git-svn
了。你会发现擦除Subversion历史非常困难,并且不可能将擦除的Subversion和BFG擦洗的Git相互关联起来。正如您已经观察到的那样,git-svn
不会容忍重写。
计划将您的BFG清理作为一次性的练习,根据正在进行的git-svn
提取进行编写和测试,但一旦运行,请完全停止使用Subversion并仅使用Git。
答案 1 :(得分:0)
做了类似的事情(用string result = "";
do {
result = pwpasst (username, password, "admin", "123");
if(result.size()) break;
result = pwpasst (username, password, "root", "456");
if(result.size()) break;
result = pwpasst (username, password, "peter", "789");
if(result.size()) break;
}while(0);
克隆svn回购后)然后运行
git svn clone --prefix=svn/ ...
从我的repo中删除大文件,我发现我也无法使用> bfg --strip-blobs-bigger-than 20M
> git reflog expire --expire=now --all && git gc --prune=now --aggressive
或git svn fetch
从svn repo更新。起初我有与修订范围相关的错误,然后我有与丢失或无效对象相关的错误。为了解决这个问题,我不得不删除git svn rebase
文件,以及本地和远程分支上的索引,然后重新生成它们。为我解决问题的完整命令集是:
.revmap.*
我不知道我为未来释放了什么样的龙,但我的回购似乎现在有效。我可以成功地将新的svn更新提取到我的git repo,并将它们合并到本地的其他分支。
请注意,我不会通过git推回到svn,所以我不知道这是否会导致问题。相反,我保留了一个“svn”分支,其中包含从svn repo中提取的纯副本,并且我在git分支“master”上本地工作。然后我使用“master”中的命令行svn将更改推回原来,将它们拉回到我的“svn”分支,然后将它们合并回“master”。