簡體   English   中英

如何將git存儲庫與svn存儲庫重新連接?

[英]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的不同版本之間存在一些兼容性問題,但這可能有點棘手:

  1. 克隆原始的Git存儲庫:

     $ git clone $GIT_SERVER repo $ cd repo 
  2. 更新.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/* 
  3. 現在你必須使用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 
  4. 如果您有許多分支和標記,請針對我們上面指定的映射重復相同的步驟:

    • branches / foo => refs / remotes / foo

    • tags / 1.0 => refs / remotes / tags / 1.0

  5. 最后一步是恢復.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

關於細節,這是ProGit書中的

您編寫的錯誤消息可能是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服務器具有的所有提交時才這樣做。

這個怎么樣:

  • 做個備份!
  • 將svn歷史重新導入git
  • 將舊分支和新分支放入同一個倉庫
  • 將您的分支倒回到F之前的提交
  • 重新啟動分支中的所有更改,因為您的C在新svn導入的C之上
  • 重新嘗試合並

如果這不起作用,你可以嘗試Git替換 ,但這可能是一個壞主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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