簡體   English   中英

git-svn:將現有git存儲庫的全部歷史記錄提交到一個空的Subversion子目錄中

[英]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文件,並且rebasedcommit都將繼續顯示相同的錯誤消息。 我做錯了什么?

您簽出的分支不是來自subversion,因此git svn不知道如何使用它。

Git確實可以,所以您需要做的是使用簡單的git rebase來重新建立git-svnrefs/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM