git與svn的區別 ?Git 與 SVN那個更好?


git與svn的區別 :


http://www.360doc.com/content/12/1228/20/11220452_256857021.shtml



在版本控制系統的選型上,是選擇Git還是SVN?


對于開源項目來說這不算問題。使用Git極大地提高了開發效率、擴大了開源項目的參與度、 增強了版本控制系統的安全性,選擇Git早已是大勢所趨。


但對于企業用戶來說這個決心不太好下。部分原因是出于對Git的誤解,部分原因是尚不了解 Git到底能給項目管理帶來什么好處。希望本文能對您項目的版本控制系統選型提供幫助。


?


對SVN的迷信和對Git的誤解


?


誤解1:SVN只能檢出(checkout)一個版本(revision)的代碼,而Git卻可以脫庫!



這個誤解是如此普遍,簡直成了SVN在企業市場中封殺Git的尚方寶劍。其實稍微思考一下 這個謠言就很難傳播。既然SVN能夠讀取授權訪問的文件的每一個版本,那么就能夠重組這些版本, 進而實現對版本庫的完整復制。即SVN也可以脫庫。

wKioL1YokhKxqGhcAABtIYfyWKw657.jpg




為什么 Git 比 SVN 好


SVN脫庫的工具SVN本身就提供: svnsync 。這個工具主要用于SVN的版本庫鏡像。 例如將版本庫http://host.name/svn/repo 脫庫到本地的 dump 目錄,命令如下:

1
2
3
4
5
$?svnadmin?create?dump
$?printf?'#!/bin/sh\nexit?0\n'?>?dump/hooks/pre-revprop-change
$?chmod?a+x?dump/hooks/pre-revprop-change
$?svnsync?init?file://$(pwd)/dump?http://host.name/svn/repo
$?svnsync?sync?file://$(pwd)/dump

如果使用 git-svn 則為SVN“脫庫”更簡便。

1
2
??
$?git?svn?clone?-s?http://host.name/svn/repo?dump

有人認為SVN可以對目錄授權,從而阻止對整個版本庫進行脫庫操作。 下面就來看看SVN的授權究竟是否可靠。


?


誤解2:SVN能對目錄進行精細授權,而Git太不安全


SVN的目錄授權對管理員來說是災難,管理負擔相當重,在分支或里程碑眾多的時候很難作對。 這是因為SVN的分支和里程碑(tags)本身就是一個目錄(使用目錄拷貝實現的)。


例如管理員為名為demo的SVN版本庫授權。一個并不太復雜的主線(/trunk)授權如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[demo:/trunk]
@demo-admin?=?rw
@leaders?=?r
??
[demo:/trunk/doc]
@demo-dev?=?rw
@designers?=?rw
??
[demo:/trunk/src/apps]
@demo-dev?=?rw
??
[demo:/trunk/src/common]
@demo-dev?=?rw
??
[demo:/trunk/src/html]
@designers?=?rw
??
[demo:/trunk/src/secret]
*?=
@demo-admin?=?rw
jiangxin?=?rw

如果項目創建了維護分支 /branches/1.x ,若和 /trunk 授權相同,則需要將上述授權在 /branches/1.x 下重建。需要在授權文件中再添加如下授權指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[demo:/branches/1.x]
@demo-admin?=?rw
@leaders?=?r
??
[demo:/branches/1.x/doc]
@demo-dev?=?rw
@designers?=?rw
??
[demo:/branches/1.x/src/apps]
@demo-dev?=?rw
??
[demo:/branches/1.x/src/common]
@demo-dev?=?rw
??
[demo:/branches/1.x/src/html]
@designers?=?rw
??
[demo:/branches/1.x/src/secret]
*?=
@demo-admin?=?rw
jiangxin?=?rw

如果版本庫的分支和里程碑越來越多,配置的工作量相當可觀,稍有不慎不是授權文件格式破壞導致SVN無法工作, 就是造成開放授權。


我曾經寫過SVN路徑授權的補丁,并寫了一款SVN版本庫管理的開源軟件 (參見 《pySvnManager手冊》 ), 但想完美解決這個問題很難。我的一個設想是在SVN對分支和里程碑授權檢查時缺省使用 /trunk 的授權,但這樣的實現要求使用SVN嚴格遵循約定俗成的三個頂級目錄的規范。


Git對于寫操作可以精細到目錄和分支級別(使用Gitolite作為服務器), 但作為分布式版本庫控制系統,在設計上只能實現版本庫量子化的讀授權。 即某用戶對整個版本庫要么都能讀,要么對整個版本庫都不能讀。


那么如何控制Git版本庫的讀授權呢?實際上Git可以通過子模組來實現細粒度的讀授權。 即在項目需要精細授權的場合,將版本庫拆分為多個Git版本庫進行單獨授權, 再使用子模組將多個版本庫整合為一個。這個操作并不復雜,而且有助于實現項目的模塊化。


?


誤解3:Git能隨意改變歷史提交,這對于版本控制來說是不合適的


Git對歷史提交的修改只對本地提交有意義。本地提交就像是和共享版本庫間的緩沖。 在未將本地提交推送到遠程共享版本庫之前,開發者可以后悔。可以對不完整的提交說明進行補充, 可以移除錯誤的提交,可以壓縮合并提交等。Git對提交歷史靈活的操作是Git獨有的功能, 是提交審核的必備工具。


對于已經推送到遠程共享服務器的提交,Git就不能再像本地一樣隨意更改了。 因為推送到共享版本庫的提交一旦被其他程序員獲取,便擴散出去, 如覆水難收,難掩眾人悠悠之口。所以Git更改歷史提交只對本地有效,是安全的。


相比之下,SVN本地工作區和集中式版本庫之間沒有緩沖,一旦發現提交了錯誤內容, 或寫了錯誤的提交說明,則無法更改,除非SVN管理員介入。 SVN也允許配置為可修改歷史提交說明,但是一旦管理員放開此功能, 歷史提交的提交說明有可能被批量、惡意更改,并且無法恢復。


?


誤解4:SVN對中文支持更好,Git庫中的中文目錄和文件名會出現亂碼


我也曾經這么認為,并在《Git權威指南》第3章中用了大量篇幅介紹中文支持的注意事項。 并推薦使用Cygwin作為首選客戶端,以避免GBK字符集為跨平臺開發的版本庫引入亂碼。


一個好消息是Windows下最常用的Git客戶端 msysGit 也支持Unicode了。 使用最新版本(1.7.10)的 msysGit 無需設置任何Git配置變量, 版本庫中的中文文件名、目錄名、提交說明都使用Unicode編碼。 配合使用Unicode版的TortoiseGit(最新的1.7.9.0版本已是Unicode版), Windows用戶就不再為跨平臺開發的字符集問題而傷腦筋了。


?


誤解5:SVN的認證方式比Git豐富,比如可以實現LDAP認證


我為客戶配置的Git支持HTTP、SSH協議,和Gitweb。其中HTTP協議、Gitweb都使用LDAP認證, 實現統一的口令管理。并且無論是HTTP協議、SSH協議,還是Gitweb都使用同一套Gitolite授權。


?


誤解6:SVN更易上手,更易管理;而Git太難和太靈活了,不適合團隊?


如果想把配置管理做好,無論是 SVN 還是 Git 都不容易,否則 《SVN Book》 以及我寫 《Git權威指南》 也不會有那么厚了。


?


覺得SVN更簡單的,看看下面的錯誤你有沒有犯?


● 很多公司的SVN版本庫沒有遵照約定俗成的三個頂級目錄。


● 如何配置SVN悲觀鎖,以便更好地對二進制文件編輯進行協同。


● 維護合并追蹤的 svn:mergeinfo 屬性,以便能夠正確的分支合并。還要防止無此功能的客戶端對其的破壞。


● SVN如何正確的反刪除,直接添加刪除的文件是不對的。


● 如何使用 svn:eol-style 屬性,以便正確處理跨平臺開發時的文件換行符問題。


● SVN管理員如何對版本庫進行整理,如撤出不當提交、修改錯誤的提交說明。


● 版本庫的安全性問題,如何做好版本庫的備份。


SVN對分支當做路徑來授權,造成管理的負擔(參見 前面的描述 ), 因此使用SVN實現靈活的特性分支開發、可靠的發布控制(維護分支凍結)很難。


企業應用Git的困惑之一是如何裁剪出適合自己的工作流。實際上Git本身已經給出范例:


1

1
$?git?help?workflows

理解Git的應用模型并選用合適的服務器端軟件(如 Gitolite),可以定制出適合自己的工作流。 例如下表就是在企業中使用Git版本控制系統的典型角色劃分:


?

wKioL1YooMWQihZAAAHRgJCJL0Y136.jpg

再來談談Git的使用,實際上Git的設計模型非常簡單,理解了其設計思想,就可以很容易地掌握 git reset, git checkout, git rebase, git push, git pull 等命令。


?


誤解7:程序員不喜歡命令行


誰說Git沒有好的圖形工具?SVN 有 TortoriseSVN,Git 同樣有 TortoiseGit。 只不過Git的命令行太好用,使得圖形操作顯得笨拙。


至于Windows用做開發環境是否還有前途,看看火熱的iOS、Android開發、和優雅的 MacBook 就知道了。


?


Git能做到,而SVN難以做到的事情


Git分支功能最為強大,分支管理能力讓SVN望塵莫及


Git可以很容易地對比兩個分支,知道一個分支中哪些提交尚未合并到另一分支,反之亦然。


● 查看當前分支比other分支多了哪些提交:


1

1
$?git?log?other..

● 查看other分支比當前分支多了哪些提交:


1

1
$?git?log?..other

我不認為SVN的分支是真正的分支,因為分支最基本的提交隔離SVN就沒能實現。 在SVN中一次提交可以同時更改主線(/trunk)和分支中的內容, 所以判斷一個分支中哪些提交未合并到另外的分支,完全不能對SVN抱有希望。


?


Git可以實現更好的發布控制


針對同一個項目,Git可以設置不同層級的版本庫(多版本庫), 或者通過不同的分支(多分支)實現對發布的控制。


● 設置只有發布管理員才有權限推送的版本庫或者分支,用于穩定發布版本的維護。


● 設置只有項目經理、模塊管理員才有權推送的版本庫或者分支,用用于整合測試。


?


隔離開發,提交審核


如何對團隊中的新成員的開發進行審核呢?在Git服務器上可以實現用戶自建分支和自建版本庫的功能, 這樣團隊中的新成員既能將本地提交推送到服務器以對工作進行備份, 又能夠方便團隊中的其他成員對自己的提交進行審核。


審核新成員提交時,從其個人版本庫或個人分支獲取(fetch)提交,從提交說明、代碼規范、編譯測試 等多方面對提交逐一審核。審核通過執行 git merge 命令合并到開發主線中。


?


對合并更好的支持,更少的沖突,更好的沖突解決


因為Git基于對內容的追蹤而非對文件名追蹤,所以遇到一方或雙方對文件名更改時, Git能夠很好進行自動合并或提供工具輔助合并。而SVN遇到同樣問題時會產生樹沖突, 解決起來很麻煩。


Git的基于DAG(有向非環圖)的設計比SVN的線性提交提供更好的合并追蹤, 避免不必要的沖突,提高工作效率。這是開發者選擇Git、拋棄SVN的重要理由。


?


保證已修復Bug不再重現


以為創建完畢里程碑標簽(tag)便完成軟件版本的發布是有風險的, 往往會由于之前的版本(維護版本)中的一些 Hotfix 提交沒有合并到最新版本而造成已修復問題在新版本中重現。


Git分支和合并追蹤可以解決這個問題。例如用 maint 分支跟蹤最新的發行版, 當確定里程碑tag v1.6.4 為最新發行版時,在 maint 分支執行如下命令以切換到最新發行版:


1

1
$?git?checkout?maint?$?git?merge?--ff-only?v1.6.4

如果合并成功,代表發行版 v1.6.4 包含了所有前一個發行版的提交。 反之說明前一個發行版某個或某些Hotfix提交尚未合并到最新發行版中。


?


版本庫的安全性


SVN版本庫安全性很差,是管理員頭痛的問題。


● SVN版本庫服務器端歷史數據被篡改,或者硬盤故障導致歷史數據被篡改時, 客戶端很難發現。管理員的備份也會被污染。


● SVN作為集中式版本控制系統,存在單點故障的風險。備份版本庫的任務非常繁重。


Git在這方面完勝SVN。首先Git是分布式版本控制系統,每個用戶都相當于一份備份, 管理員無需為數據備份而擔心。再有Git中包括提交、文件內容等都通過SHA1哈希保證數據的完整性, 任何惡意篡改歷史數據都會被及時發現從而被挫敗。


?


更多的十條喜歡Git的理由


更多的十條喜歡Git的理由,參見 《Git權威指南》 第11-21頁。


● 異地協同工作


● 現場版本控制


● 重寫提交說明


● 無盡的后悔藥


● 更好用的提交列表


● 更好的差異比較


● 工作進度保存


● 作為SVN前端實現移動辦公


● 無處不在的分頁器


● 快


?


什么情況推薦使用SVN


SVN具有的悲觀鎖的功能,能夠實現一個用戶在編輯時對文件進行鎖定,阻止多人同時編輯 一個文件。這一悲觀鎖的功能是 Git 所不具備的。對于以二進制文件 (Word文檔、PPT演示稿) 為主的版本庫,為避免多人同時編輯造成合并上的困難, 建議使用SVN做版本控制。







本文轉自crazy_charles 51CTO博客,原文鏈接:http://blog.51cto.com/douya/1705278,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393447.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

強化學習簡介

by ADL通過ADL Reinforcement Learning is an aspect of Machine learning where an agent learns to behave in an environment, by performing certain actions and observing the rewards/results which it get from those actions.強化學習是機器學習的一個方面&#xff0…

leetcode1111. 有效括號的嵌套深度(棧)

給你一個「有效括號字符串」 seq,請你將其分成兩個不相交的有效括號字符串,A 和 B,并使這兩個字符串的深度最小。 不相交:每個 seq[i] 只能分給 A 和 B 二者中的一個,不能既屬于 A 也屬于 B 。 A 或 B 中的元素在原字…

利用Arcgis for javascript API繪制GeoJSON并同時彈出多個Popup

1.引言 由于Arcgis for javascript API不可以繪制Geojson,并且提供的Popup一般只可以彈出一個,在很多專題圖制作中,會遇到不少的麻煩。因此本文結合了兩個現有的Arcgis for javascript API擴充庫,對其進行改造達到繪制Geojson并同…

java 線程簡介_java多線程介紹

java多線程介紹多線程的基本實現進程指運行中的程序,每個進程都會分配一個內存空間,一個進程中存在多個線程,啟動一個JAVA虛擬機,就是打開個一個進程,一個進程有多個線程,當多個線程同時進行,就…

webpack入門——構建簡易版vue-cli

用vue-cli1/2搭建一個vue項目時,可以看到有很多關于webpack配置的文件。我們不需要知道那些繁瑣的配置文件有什么作用,只需在控制臺輸入npm run dev,項目自動啟動,我們就可以愉快的寫業務代碼了。 雖然vue-cli幫我們做好了一切&am…

leetcode43. 字符串相乘

給定兩個以字符串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。 示例 1: 輸入: num1 “2”, num2 “3” 輸出: “6” 代碼 class Solution {public String multiply(String num1, String num2) {if(n…

作業二:個人博客作業內容:需求分析

作業二:個人博客作業內容:需求分析 怎樣與用戶有效溝通獲取用戶的真實需求?訪談,正式訪談系統分析員將提出一些事先準備好的具體問題;非正式訪談中,分析人員將提出一些用戶可以自由回答的開放性問題&#…

HBase數據備份及恢復(導入導出)的常用方法

一、說明 隨著HBase在重要的商業系統中應用的大量增加,許多企業需要通過對它們的HBase集群建立健壯的備份和故障恢復機制來保證它們的企業(數據)資產。備份Hbase時的難點是其待備份的數據集可能非常巨大,因此備份方案必須有很高的…

react和react2_為什么React16是React開發人員的福氣

react和react2by Harsh Makadia通過苛刻馬卡迪亞 為什么React16是React開發人員的福氣 (Why React16 is a blessing to React developers) Just like how people are excited about updating their mobile apps and OS, developers should also be excited to update their fr…

jzoj4598. 【NOIP2016模擬7.9】準備食物

一個th的題(a gensokyo) 難度系數在該知識點下為$2.1$ 區間xor我們很明顯會想到trie樹,將每一個區間$l~r$異或和拆成$sum[l-1]$ $sum[r]$兩個數的異或 注意到二進制的性質,比當前低的位即使都取1加起來都沒有這位選1答案高&#x…

java number轉string_Java Number類, Character類,String類

字符串在Java編程中廣泛使用,字符串就是一系列字符(由一個個的字符組成)。 在Java編程語言中,字符串被視為對象。Java平臺提供String類來創建和操作字符串。1. 創建字符串創建字符串的最直接方法是 -String str "Hello world!";每當它在代碼中…

Android商城開發系列(二)——App啟動歡迎頁面制作

商城APP一般都會在應用啟動時有一個歡迎界面,下面我們來實現一個最簡單的歡迎頁開發:就是打開商城App,先出現歡迎界面,停留幾秒鐘,自動進入應用程序的主界面。 首先先定義WelcomeActivity布局,布局非常簡單…

DELL安裝不了mysql_Windows 版本 Mysql 8.x 安裝

1、官網下載安裝包百度網盤鏈接:https://pan.baidu.com/s/1cFRbQM5720xrzMxbgjPeyA提取碼:xlz72、解壓安裝包并新建一個文件夾作為安裝目錄(mysqlInstall)3、配置 Mysql 環境變量4、在解壓好的目錄下新建一個 my.ini 文件(注意:my.ini 文件和…

lambda 使用_如何使用Lambda和API網關構建API

lambda 使用Do you want to access your database, control your system, or execute some code from another website? An API can do all of this for you, and they’re surprisingly easy to set up.您是否要訪問數據庫,控制系統或從其他網站執行一些代碼&…

Hyper-V Server聯機調整虛擬硬盤大小

1. 技術概述: 從 Windows Server 2012 R2開始,管理員可以在運行虛擬機的同時,使用 Hyper-V 來擴展或壓縮虛擬硬盤的大小。存儲管理員可以通過對運行中的虛擬硬盤執行維護操作來避免代價不菲的停機。不再需要關閉虛擬機,這可以避免…

leetcode162. 尋找峰值(二分法)

峰值元素是指其值大于左右相鄰值的元素。 給定一個輸入數組 nums,其中 nums[i] ≠ nums[i1],找到峰值元素并返回其索引。 數組可能包含多個峰值,在這種情況下,返回任何一個峰值所在位置即可。 你可以假設 nums[-1] nums[n] -…

python網絡爬蟲(5)BeautifulSoup的使用示范

創建并顯示原始內容 其中的lxml第三方解釋器加快解析速度 import bs4 from bs4 import BeautifulSoup html_str """ <html><head><title>The Dormouses story</title></head> <body> <p class"title"><…

Mingw編譯DLib

Mingw編譯DLib 因為機器上安裝了qt-opensource-windows-x86-mingw530-5.8.0&#xff0c;所以準備使用其自帶的mingw530來編譯DLib使用。 因為DLib使用CMake的構建腳本&#xff0c;所以還請先安裝好CMake。 cmake的下載地址如下https://cmake.org/files/v3.7/cmake-3.7.2-win64-…

探索JavaScript的關閉功能

Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“發現功能JavaScript”被BookAuthority評為最佳新功能編程書籍之一 &#xff01; A closure is an inner function that has access to the outer scope, even…

QueryList 配置curl參數 的文檔位置 QueryList抓取https 終于找到了

需要設置ssl證書&#xff0c;或者不驗證證書&#xff0c;例&#xff1a;$ql QueryList::get(https://...,[],[verify > false]);設置這個 verify > false , 所以curl的其他參數就在這里配置即可 文檔在 https://guzzle-cn.readthedocs.io/zh_CN/latest/request-optio…