2011-03-09 27 views
9

我們團隊的一部分發現git很酷,並開始使用它作爲svn客戶端。所以每個開發者都有一個本地的git倉庫,並通過git-svn與svn同步。是一個bidrectional Git <-> Svn同步(可寫)可能嗎?

然後,我們想做代碼審查的提交併發送補丁同事審查。這種方法不是很直觀,因爲svn中的SAME修訂版的校驗和對於每個本地git存儲庫都不相同。不知道爲什麼,因爲內容應該是相同的。也許這是svn rebase中的一個錯誤?

所以我們試圖在scm服務器上建立一箇中央的git倉庫。現在每個使用git的開發人員都可以將他的更改推送到這個中央存儲庫,而執行審查的其他開發人員可以將這些更改拖到他的回購站中。不幸的是,因爲每個開發者也與svn rebase同步,校驗和問題再次出現在那裏。

閱讀很多帖子後,我覺得管理一個團隊,既顛覆和git客戶最好的辦法是讓:

  1. 中央Subversion版本庫
  2. 中央Git倉庫(產地)
  3. 服務器
  4. 在中央Git的工作副本對於每一個混帳開發一個本地的Git倉庫
  5. 對於每個SVN開發一個普通的工作拷貝

現在我們需要一箇中央工作來同步svn和git,在服務器上的中央git工作副本上執行這樣的常規腳本。

# First transfer the commits from git to svn 
git checkout svnmaster 
git pull origin svnmaster 
git svn dcommit 

# Now from svn to git 
git svn rebase 
git push origin svnmaster 

我的問題,現在:

  1. 這是最好的辦法(而無需切換到Git的completeley)
  2. 是否有已經做同步防彈窗腳本?
  3. 是否存在已知不同校驗和的問題,並且可能有已知的解決方法 ?

感謝您的每一個回答!

編輯 我最近發現一個項目,看起來非常有前途:

SubGit

+0

我想你想解決一個不存在的問題。如果Git哈希值不同,那麼這兩個存儲庫有不同的歷史。如果兩個開發人員從相同的Subversion存儲庫(在同一個URL)獲取並獲取* all *版本,那麼最終的Git散列應該是相同的。如果沒有,你做了一些不同的事情。如果你能把這些問題整理出來,大部分問題的其餘部分都不會成爲問題。 (我知道它是這樣工作的,因爲我已經完成了。) – 2011-03-09 05:58:22

+1

實際上哈希可能很容易變得不同,這取決於是否每個人都有相同的作者文件等細節。 – 2011-03-09 10:52:02

+2

我是SubGit(http://subgit.com/)開發者,並且想補充說SubGit程序已經進入了它的EAP階段。 SubGit刪除所有git-svn rebase/dcommit/fetch的麻煩,並允許使用真正的git不知道有一個Subversion存儲庫。 – 2011-09-02 21:30:36

回答

5

您的解決方案存在問題。我建議你不要直接在svnmaster中提交。你應該爲svn(svn-dev)和svn跟蹤分支(svn-master)建立一個純粹的git分支。請按照以下步驟承諾的svn:

git checkout svn-master 
git merge --no-ff svn-dev 
git svn dcommit 
git checkout svn-dev 
git merge svn-master 

這個順序允許您保留提交哈希所有存儲庫。

+0

因此,要首先對svn進行更改,需要更改被分割成svn-dev。但是如果一個只使用svn的團隊成員直接承諾svn呢?誰做了rebase? – schoetbi 2011-03-10 05:40:46

+0

而不是rebase,只是獲取svn-master,並將其合併到svn-dev – gor 2011-03-10 05:50:16

+0

@schoetbi:承諾* subversion *允許沒有限制。但在git方面,您需要一個僅用於跟蹤顛覆(svn-master)和一個或多個發生實際發生的分支(svn-dev)的分支。 – 2011-03-10 07:28:11

2

通常你想要做的是不推薦的(至少可以說什麼:真正的聲明更像是「唐「T「)。

我實際上試圖做一些類似的事情,我們曾經有一個與我們合作過的svn樹的離線git副本。雖然它能夠很好地跟蹤上游SVN的變化,但它無法推回到SVN樹中(如果你使用git分支做任何事情,就完全忘了它)。

請仔細閱讀git-svn手冊頁。它反覆說git-svn!= git。具體來說,git-svn < < git。當然,它比SVN本身更好,但將它作爲SVN存儲庫的完整「git克隆」並不安全,您可以在其中執行任何操作並將其推回。

作爲示例,請考慮需要進行更改的審閱者。他做出改變,將結果推回到git repo,審查過的變更由原作者檢查,原始作者執行dcommit。請記住,唯一的SVN身份驗證來自git-svn客戶端,因此原始作者是「將更改提交給SVN樹」並因此獲得所有權的所有權。當你讓多個人同時向git回購工作時,情況會變得更糟。第一個執行dcommit的人(如果它真的有效,並且可能不會)將擁有所有更改的所有權。

+0

感謝您的有用答案。我在這裏還找到了另一種方法:http://kris.me.uk/2010/10/01/svn-master-with-git-mirrors.html – schoetbi 2011-03-09 08:45:19