[英]git-svn: commit whole history of an existing git repository into an empty Subversion sub-directory
我一直在計算機上本地處理一些代碼,使用git(無遠程)跟蹤修改。 該代碼現在將成為更大項目中的模塊,該代碼的代碼庫存儲在Subversion中(所以類似https://svnserver/svnroot/project/trunk/module_x
),所以我認為我可以使用git-svn將Subversion存儲庫作為遠程管理。 我記得以前在另一個項目中這樣做過,但是找不到操作方法(中間的計算機已更改)。
這是我嘗試過的:
cd ~/mygitrepo/
git svn init https://svnserver/svnroot/project/trunk/module_x
git svn fetch
git svn rebase
最后一條命令產生以下錯誤消息:
Unable to determine upstream SVN information from working tree history
我在某處讀到它可能是因為Subersion中的目錄為空,所以我嘗試將虛擬文件分別提交給SVN然后運行:
git svn fetch
A dummy.txt
r10744 = 89294ba713c6fed368f3b879c8dc7744b1015308 (refs/remotes/git-svn)
但是,我在git repo中找不到dummy.txt
文件,並且rebase
和dcommit
都將繼續顯示相同的錯誤消息。 我做錯了什么?
您簽出的分支不是來自subversion,因此git svn
不知道如何使用它。
Git確實可以,所以您需要做的是使用簡單的git rebase
來重新建立git-svn
( refs/remotes/git-svn
)。 然后,歷史記錄將包含來自subversion的提交,而git svn dcommit
將知道在何處提交。
另一件事是,您所做的更改必須先放置在正確的子目錄中, 然后再嘗試重新設置它們的基礎,因為git rebase
不支持移動到子目錄中。 git merge
通過subdirectory
策略進行,但是使用merge將作為單個提交導出到Subversion。 如果要導出完整的歷史記錄,並且在所有commits中都沒有將其保存在正確的目錄中 ,則必須使用git filter-branch
進行修復。
Jan提供的答案給出了我遇到的錯誤的理由,並指出普通的舊git rebase --onto
是正確的解決方案,但缺少實際的命令。
我最初提出這些命令是對他的回答的編輯,但被拒絕了,所以去了:
git checkout -b svnrebase git-svn # create a temporary branch
git cherry-pick master~1 # cherry pick the first commit
git rebase --onto svnrebase master~1 master # rebase the 2nd through current commit
git svn dcommit # finally commit the results to svn
需要注意的是master~1
必須改變,以引用您的第一次提交的git的主人。 在這里,我們假設我們有一個只有兩次提交的git repo。
有必要創建臨時分支和櫻桃挑第一承諾掌握因為rebase --onto
只變基后進行的修改的范圍master~1
(以及master~2
參考不會與只是兩次提交存在)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.