[英]How can I reconnect a git repository with a svn repository?
我使用git svn
將現有的Subversion repo導入git。 然后我把它推到git服務器上的git repo。 在過去幾個月中,Subversion和git存儲庫都對軟件進行了更改。 不幸的是,我的本地副本與svn和git之間的鏈接已被刪除。
我曾嘗試再次使用git svn
重新創建本地副本,但是當我從git服務器執行拉取時,它會warning: no common conflicts
,我最終會在開始時將兩個單獨的分支合並到相同的提交中。 像這樣:
F
|\
| \
E D
| |
C C
| |
B B
| |
A A
我怎樣才能讓它處理svn變化,就像它們發生在原始倉庫的分支上一樣?
F
|\
| \
E D
| /
|/
C
|
B
|
A
默認情況下, git-svn
存儲SVN版本與提交消息中的Git提交之間的映射。 您是否在原始Git存儲庫中看到這些git-svn-id
行用於舊提交? 這里我的意思是Git存儲庫托管在Git服務器上,而不是最近從SVN獲取的那個。
如果是這樣,你實際上沒有松開任何鏈接,git-svn應該能夠從歷史記錄中恢復必要的數據。 雖然由於git-svn的不同版本之間存在一些兼容性問題,但這可能有點棘手:
克隆原始的Git存儲庫:
$ git clone $GIT_SERVER repo $ cd repo
更新.git / config中的git-svn配置:
$ git config svn-remote.svn.url $SVN_URL $ git config svn-remote.svn.fetch trunk:refs/remotes/trunk $ git config svn-remote.svn.branches branches/*:refs/remotes/* $ git config svn-remote.svn.tags tags/*:refs/remotes/tags/*
現在你必須使用git-svn-id行更新refs / remotes / * refs到最新的提交:
$ git log --first-parent refs/heads/master commit d566edf5f77ae0a2f7418c40949757e75ef8e83c D commit 4df9f21346526c6505a954d8310637864710308d C git-svn-id: $SVN_URL .../trunk@3... commit 116a6760d3e278aa4d54f5bb22e531d30d731661 B git-svn-id: $SVN_URL .../trunk@2... commit d8bb201c6fd55ea5e645f2d8a07248593d177910 A git-svn-id: $SVN_URL .../trunk@1...
正如你所看到的,commit D沒有git-svn-id行,但是commit C有一行而該行指的是trunk,所以你必須更新refs / remotes / trunk來提交C:
$ git update-ref refs/remotes/trunk 4df9f21346526c6505a954d8310637864710308d
如果您有許多分支和標記,請針對我們上面指定的映射重復相同的步驟:
branches / foo => refs / remotes / foo
tags / 1.0 => refs / remotes / tags / 1.0
最后一步是恢復.git / svn目錄中的映射:
$ git svn fetch Migrating from a git-svn v1 layout... Data from a previous version of git-svn exists, but .git/svn (required for this version (XYZ) of git-svn) does not exist. Done migrating from a git-svn v1 layout Rebuilding .git/svn/refs/remotes/trunk/.rev_map.694389ff-b137-4359-84f9-4d1a25628e89... r1 = d8bb201c6fd55ea5e645f2d8a07248593d177910 r2 = 116a6760d3e278aa4d54f5bb22e531d30d731661 r3 = 4df9f21346526c6505a954d8310637864710308d Done rebuilding .git/svn/refs/remotes/trunk/.rev_map.694389ff-b137-4359-84f9-4d1a25628e89
最后一個命令也從SVN服務器獲取新的修訂版。 命令完成后,您有一個Subversion存儲庫的git-svn克隆。 此存儲庫中的歷史記錄有所不同,因此您必須通常在SVN和Git存儲庫之間同步更改:
$ git svn rebase
$ git svn dcommit
希望有所幫助。
首先,我檢查git svn info
命令的輸出。 你看到一些奇怪的東西嗎?
其次,問題是將git svn
與除本地git存儲庫之外的輔助git存儲庫一起使用並不是一個好主意。
原因是在每個git svn dcommit
git會自動重寫你之前做的所有提交 :首先它將它們提交回svn,然后為提交添加svn修訂號(在一個名為git-svn-id
的唯一標識符中)。
在您創建新dcommit
的存儲庫中應該是這樣的:
$ git log -1
commit 1234abc...
Author: ...
Date: ...
Some commit message
git-svn-id: http://your.svn.repo/svn/trunk@10 1234abc
您編寫的錯誤消息可能是warning: no common commits
(不是您在問題中寫的conflicts
),我的印象是git沒有將這些元數據推送到遠程倉庫。
我想你可以從死機中提升這個SVN鏈接,但要小心,將它放在repo的單獨克隆上,並仔細閱讀文檔,了解它需要什么元數據。 在git中,你可以用管道工具做很多事情,看看它們。
順便說一下你不能簡單地克隆遠程git倉庫並使用它嗎?
希望這有所幫助,或至少給你一些想法,你可以開始尋找解決方案。
從提交圖表
F
|\
| \
E D
| |
C1 C2
| |
B1 B2
| |
A1 A2
使用以下命令
git checkout <SHA1-B1>
git checkout -b new
git cherry-pick <SHA1-C2> <SHA1-D>
git checkout <SHA1-F>
git checkout -b position_f
git merge new
完成。 無論如何,我還沒有嘗試過。 首先備份您的存儲庫。
最簡單的解決方案是將本地git-svn分支推送到您的git服務器,如下所示:
git push <git-server> <branch-name>:<branch-name>
它將使用您的本地分支覆蓋git-server分支。
只有當你確定git-svn分支具有git服務器具有的所有提交時才這樣做。
這個怎么樣:
F
之前的提交 C
在新svn導入的C
之上 如果這不起作用,你可以嘗試Git替換 ,但這可能是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.