2014-10-09 230 views
0

我在哪裏工作,我們使用Git來處理當前的項目,但我們在SVN上有一些遺留項目。我正在將幾個大型遺留項目(26,000+個提交)從SVN轉換爲Git。將SVN倉庫轉換爲Git,維護SVN倉庫

但是,我的問題是,我們也希望保留SVN倉庫。原因在於部署是通過更新/切換客戶端環境中存在的SVN檢出來處理的:更新我們的部署腳本以使用Git,重新配置我們所有客戶的環境以使用Git檢出等是一項非常重要的任務;我們認爲,切換到Git的好處(對於所有項目都有一個具有一致的拉取請求/代碼審查流程的單個VCS),可悲的是這樣做的成本超過了這個成本。

因此,作爲一種妥協,我們希望有一個工作流程是這樣的:

  • Github上拉請求。
  • 將拉取請求合併到主。
  • 使用Git master分支中的最新代碼更新SVN。
  • 更新客戶端服務器上的SVN簽出。

SVN只會作爲此過程的一部分寫入(即我們只需要在一個方向同步:Git到SVN)。

我已經看到git svn命令和https://github.com/nirvdrum/svn2git和一個同事已經成功使用SVN從SVN生成Git存儲庫。但是,在檢出他生成的存儲庫(來自Github)後,我無法輕鬆地將提交返回到SVN。我們原本打算使用git svn dcommit來做到這一點,但據我瞭解,這個命令本質上需要Git倉庫與SVN同步。 git svn dcommit似乎沒有與Git倉庫的全新結帳工作:我相信這是因爲git svn initgit svn fetch需要已經運行之前dcommit將工作(請糾正我,如果我錯了)。

與此問題是,git svn fetch需要運行在這個大的倉庫。任何希望執行發佈的開發人員都需要將SVit簽出與SVN同步,這似乎不是一個合理的選擇,特別是當它被認爲是傳統項目,但很少。

作爲dcommit的替代方案,我編寫了一個腳本來檢出SVN和Git存儲庫,刪除SVN checkout的內容並將其替換爲Git存儲庫的內容,然後提交回SVN。使用這種方法,提交的原子性和新提交的歷史記錄不會被複制到SVN,但這不是問題。歷史依然存在於Git中:只要SVN反映了Git中文件的最新狀態,就不會有問題。這幾乎似乎工作,但這個腳本生成大的空白提交(對於行結束的變化)和從SVN刪除空目錄(Git不支持像SVN提交空目錄)有一些問題。

有沒有更好的方法來處理這個工作流程?如果腳本是要走的路,您能否提出任何配置選項以使此過程順利進行?我認爲SVN的eol-style和Git的core.autocrlf設置可能可以用於解決此問題(可能與dos2unix這樣的工具結合使用),但我無法完全解決最佳方法。我可以用.gitkeep「佔位符」文件解決空目錄問題,但這顯然需要測試代碼以確保這些文件可以存在而不會造成問題:是否有其他解決方法?

任何意見讚賞。

+0

一個骯髒的方法來解決每個開發人員做一個新的'git svn fetch'的問題可能是共享一次獲取的副本(可能會從時間更新)。另一種選擇可能是創建一個簡單的共享(web)工具來壓縮git的變化並推送到svn。但調整您的同步腳本(修復EOL和目錄)的路徑看起來對我來說是最合理的。 – 2014-11-18 22:04:32

回答

0

我還沒有到試圖回到SVN的階段(當我這樣做的時候,我正在悄悄地討厭EOL問題),但我可以告訴你一種處理git checkout的方法,以便它在大型資料庫上不需要幾天時間。

訣竅是將歷史限制到您需要的最小值。當你想從SVN創建git倉庫時,請在SVN日誌中查找你想要的分支的最新版本。如果您根本不在乎歷史,或者在最近(通常是幾天)進行一些修訂,則這可以是HEAD修訂版。

git svn clone -r nnn:HEAD --prefix=origin/ --username=USERNAME svn://server/trunk/ 

的關鍵部分是放在nnn:HEAD片段版本號。這會將該版本中所有文件的當前狀態導入到git中(展平歷史記錄),然後將每個後續SVN更改記錄爲單獨的git修訂版。對於一個非常大的存儲庫,這可能還需要一兩個小時,或者如果你選擇了一個大的版本範圍,但它不應該再是幾天。

不利的一面是,你只有一個分支(或中繼),只有有限的歷史,所以如果你想看更遠,你必須使用SVN回購瀏覽器,如果你想工作在不同的SVN分支上,你必須重複這個過程(可能有一種方法可以選擇性地將其他SVN分支連接起來,但我沒有看過它)。但是,您可以根據需要創建儘可能多的本地git分支,所以它仍然會讓您走得很遠。

一旦你有了這個最初的基礎,你可以使用git svn fetch獲取新的SVN修訂版本,並且git svn rebase將這些新修訂版本應用到你的本地git分支。如果你在Windows上工作,TortoiseGit使得這非常簡單。