2014年1月24日

使用 git-svn 工具管理 SVN 專案

只要熟悉 Git 版本控制,就很難再回到過去...SVN;不是 SVN 不好,只是 Git 和 SVN 本是不同世代的工具,如果硬是要比較,就太為難 SVN 了。

不過在開發專案時,難免還是會碰到,許多專案必須使用  SVN 的困境,還好先進的 Git 提供 git-svn 的橋接工具,讓你可以在自己的電腦上使用 Git 管理,但是專案的遠端版本管理仍繼續維持 SVN 伺服器。

我們就別談 Git 哪邊比 SVN 好,先來看看使用 git-svn 有哪些好處吧?
  • 使用 Git 做 diff / merge 比較輕鬆容易又方便
  • 在 Local 端可以多次 Commit,不必每次的 Commit 都要 Push 到伺服器
  • 離線狀態仍然可以繼續 Commit... Commit...
  • 和支援 Git 的 IDE 完美合體
  • 在 Local 端可以輕鬆開 Branch 做實驗性的程式修改
  • 除了發佈到一份 SVN Repository,還可以同時 Push 到其他"多份" Git Repository 分散式保存(備份!)
  • ... 以及更多的好處請自行體驗。

以下是我自己使用 git-svn 的 SOP,目前用了兩個月過程還算沒啥大問題。

新建專案

在建立 Local Repository 的時候,建議是以 SVN 為主,利用 git svn 從 SVN 主機取出程式碼。

git svn clone https://SVNSERVER/svn/trunk/ git-svn-test-only

如果是已經很老的陳年 Repository,上面的指令可能執行到天荒地老還沒跑完,可以指定只取出最後的 Revision。

git svn clone -r HEAD https://SVNSERVER/svn/trunk/ git-svn-test-only

進入專案資料夾(不解釋)。

cd git-svn-test-only

新建一個檔案(測試ONLY)。

echo hello > readme.md

加入新檔案(測試ONLY)。

git add readme.md

建立一個新的 Commit(只是在 Local 做 Commit,不會送出給 Server,事後還可以反悔)。

git commit -a -m 'first commit'

每次 Commit 到 SVN 之前,要先做 rebase 保平安。

git svn rebase

看到以下的訊息就可以鬆一口氣。

Current branch master is up to date.

放心地將 Commit 發送到 SVN 伺服器,這個指令會真的做 Push 喔(不能反悔)!!!

git svn dcommit

增加遠端 Git 伺服器

只靠 SVN 伺服器,萬一哪天好死不死 Local 資料誤刪,然後伺服器也剛好掛點,程式碼就會從地球上消失。

增加多個遠端 Git 伺服器,除了在大型的多團隊協作專案可能會有需要外,也可以拿來當專案程式碼的異地備援,求個永保安康。

以 GitHub 建立的 Git Repository 為例,利用 git remote add 加入專案中。

git remote add github git@github.com:GITUSER/git-svn-test-only.git

先從遠端取得已經存在的資料(如果有)。

git fetch github

先在 Local 端做一次 Merge 合併 SVN 和 Git Repository 兩邊的檔案。

git merge github/master

將異動提交給 SVN。

git svn rebase

git svn dcommit

也送一份到 Git。

git push github master

每次改程式的事後指令

就像平常使用 Git 一樣加入新增的檔案。

git add src/*

就像平常使用 Git 一樣先做 Commit。

git commit -a -m 'some comments'

記得先做 svn rebase。

git svn rebase

將 Commit(s) 送給 SVN 伺服器。

git svn dcommit

將 Commit(s) 送給 Git 伺服器。

git push github master

4 則留言:

  1. 你好。請問您知道OpenJDK和OracleJDK的內容差在哪裡嗎?
    Ubuntu PPA提供的Java JRE和Oracle上下載的JRE是不是有一點不一樣。

    回覆刪除
  2. 恩,開始要改code了,應該要來認真看一下,這個功能了。

    回覆刪除
  3. 如果同時要Commit到trunk和production,你會怎麼做?

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!