歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> SVN+GIT=魚與熊掌兼得

SVN+GIT=魚與熊掌兼得

日期:2017/3/1 17:21:52   编辑:關於Linux
使用git已經有一段時間了,從使用git的第一天開始,就計劃逐步放棄svn.

svn有的功能,git都能做到,而且做得更出色,況且git還有很多特性svn望塵莫及,還有什麼理由繼續使用svn呢?

well,理由很多. 比如,git在windows上的性能問題, TortoiseGIT還沒有開發出來(或者根本沒有這個計劃?),團隊中其它人員不習慣用git....等等.

那麼,魚與熊掌,能否兼得?

=== SVN 之痛與癢===

svn的最大問題是不支持分布式開發. 分布式並不一定就是指象Linux Kernel那樣的大型協作開發場景.

例如,你想把沒做完的工作帶回家做,但是家裡又不能連線到公司的svn服務器,那麼你就不能commit. 實際上,這也是一種分布式開發的場景.

你會說,那你就不要commit啊... 我辦不到, 我有個壞習慣,經常做些小改動,但是十分鐘後就後悔了想改回來,只有經常commit我才能找回上次,上上次變更.

當然,我有壞習慣因此我不會commit到trunk或主branch上,否則會被扁死:-)
所以,我經常有很多臨時branch要merge,頻率非常之高...在svn中的merge並不好玩.

不得不說,svn的repository設計很糟糕. 慢, 特別是在項目規模上去,開發周期長時,repository迅速膨脹.項目樹中到處都是.svn也是很討厭.

但是, TortoiseSVN實在是方便, 很多人使用SVN就是因為圖這個方便.
支持SVN的IDE也數不勝數.

SVN,既痛又癢....

=== GIT 的威力===

git很快,真的很快,比小李飛刀還快...(當然是在Linux下).
試試checkout Linux Kernel的各個tag,那個速度,不得不佩服,呵呵~

其實對於小項目來說,速度倒無所謂,不差那麼幾秒,git還有很多cool things.

git diff很強大,真的很強大.比較任何兩個歷史版本,速度飛快.

git中做branch簡直太簡單了,branch merge也是非常的爽,更不用說three way merge了. 當然還有很多很cool的特性,例如,與別人的git tree進行merge ... 其實這些或多或少都是由於分布式的特性帶來的.

還有那些通過email commit等等一般小團隊開發用不到的功能,就不多說了.

=== 魚與熊掌兼得===

首先,svn照用,主版本管理用svn(照顧團隊嘛).

然後在項目目錄下建git repository: git init.
這只在項目根目錄下多出一個.git目錄,不會象svn或cvs那樣,每個子目錄都有它的垃圾.

接下來,建立.gitignore文件,把不需要git管理的文件,加入此表,例如.svn. 或者進入.git/info編輯exclude文件.

加入git: git add .

完成了,就這麼簡單.

從此以後,小的,臨時的改動,通通用git來管理,又快又准,還不影響別人. 因為你只用到本地git repository,與其他人無關.

各人建各人自己的git tree,互不干擾. 當然,如果你想日後某一天可以merge別人的tree,那麼還是建一個bare public tree吧, 各人clone一個,然後工作在自己的branch下,平時還是照樣離線commit,需要時push.

在家裡工作?沒問題,照樣可以commit,git是分布式的.

回到公司後,想commit到svn?沒問題,在git中checkout你想要的"working code"版本,再在svn中commit, 然後git再checkout HEAD,繼續前行

=== 結論===

svn和git結合, 可以帶來以下好處:
1) 與單獨使用svn的其它組員不沖突
2) 享受git分布式帶來的好處
3) 可以滿足svn commit working code的需求
4) svn大粒度管理,減輕svn repository的壓力.
5) svn繼續發揮GUI便利的優勢.

所以, SVN + GIT = 魚與熊掌兼得


有趣的是,Linus當時設計git的時候,說:"...當碰到一個特性不確定應該采取什麼樣的設計時,就只要照著svn的反方向設計就對了..."


摘自 Step Third
Copyright © Linux教程網 All Rights Reserved