2016-11-10 24 views
1

我有一個從SVN與git-svn遷移的Git倉庫。 我用git svn fetch從SVN獲取最新的提交。我想推回購買GitHub,但歷史上有一些文件大於100 MB that I had to remove,所以我用bfg repo cleaner擺脫它們。git svn fetch在bfg清理後給出「無效的修訂範圍」「錯誤:128」

$ 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的限制)工作,因爲我不希望這些文件?任何方式來重新計算散列或使其忽略不匹配?

回答

1

雖然git-svn提供了對Subversion到Git的相當不錯的鏡像支持,但您將無法將其與歷史重寫清理工具(如BFG)結合使用。

如果您需要清理存儲庫,您應該考慮完成Subversion-to-Git遷移,爲您的轉換和遷移編寫腳本,並轉移到Git-first提交併放棄Subversion存儲庫,在此時你不會在乎git-svn了。你會發現擦洗Subversion的歷史非常困難,並且不可能將擦洗過的Subversion和BFG擦過的Git與彼此關聯起來。正如你已經觀察到的,git-svn不會容忍重寫。

您BFG清理

計劃是一次過的工作,腳本和對你正在進行的git-svn取測試,但一旦運行,停止使用Subversion乾脆只使用Git的。

0

做類似你的東西后(克隆與​​的svn的),然後運行

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

從我的回購協議中刪除大量文件,我發現我也無法從任何一個將svn更新git svn fetchgit 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上工作。然後我使用來自「master」的命令行svn將更改推回,將它們拉回到我的「svn」分支,然後將它們合併回「master」。