1. 程式人生 > >git: 四種git協議 (本地協議、HTTP 協議、SSH協議、 Git 協議)

git: 四種git協議 (本地協議、HTTP 協議、SSH協議、 Git 協議)

到目前為止,你應該已經有辦法使用 Git 來完成日常工作。 然而,為了使用 Git 協作功能,你還需要有遠端的 Git 倉庫。 儘管在技術上你可以從個人倉庫進行推送(push)和拉取(pull)來修改內容,但不鼓勵使用這種方法,因為一不留心就很容易弄混其他人的進度。 此外,你希望你的合作者們即使在你的電腦未聯機時亦能存取倉庫 — 擁有一個更可靠的公用倉庫十分有用。 因此,與他人合作的最佳方法即是建立一個你與合作者們都有權利訪問,且可從那裡推送和拉取資料的共用倉庫。

架設一臺 Git 伺服器並不難。 首先,選擇你希望伺服器使用的通訊協議。 在本章第一節將介紹可用的協議以及各自優缺點。 下面一節將解釋使用那些協議的典型設定及如何在你的伺服器上執行。 最後,如果你不介意託管你的程式碼在其他人的伺服器,且不想經歷設定與維護自己伺服器的麻煩,可以試試我們介紹的幾個倉庫託管服務。

如果你對架設自己的伺服器沒興趣,可以跳到本章最後一節去看看如何申請一個程式碼託管服務的帳戶然後繼續下一章,我們會在那裡討論分散式原始碼控制環境的林林總總。

一個遠端倉庫通常只是一個裸倉庫(bare repository)— 即一個沒有當前工作目錄的倉庫。 因為該倉庫僅僅作為合作媒介,不需要從磁碟檢查快照;存放的只有 Git 的資料。 簡單的說,裸倉庫就是你工程目錄內的 .git 子目錄內容,不包含其他資料。

協議

Git 可以使用四種主要的協議來傳輸資料:本地協議(Local),HTTP 協議,SSH(Secure Shell)協議及 Git 協議。 在此,我們將會討論那些協議及哪些情形應該使用(或避免使用)他們。

本地協議

最基本的就是 本地協議(Local protocol) ,其中的遠端版本庫就是硬碟內的另一個目錄。 這常見於團隊每一個成員都對一個共享的檔案系統(例如一個掛載的 NFS)擁有訪問權,或者比較少見的多人共用同一臺電腦的情況。 後者並不理想,因為你的所有程式碼版本庫如果長存於同一臺電腦,更可能發生災難性的損失。

如果你使用共享檔案系統,就可以從本地版本庫克隆(clone)、推送(push)以及拉取(pull)。 像這樣去克隆一個版本庫或者增加一個遠端到現有的專案中,使用版本庫路徑作為 URL。 例如,克隆一個本地版本庫,可以執行如下的命令:

$ git clone /opt/git/project.git

或你可以執行這個命令:

$ git clone file:///opt/git/project.git

如果在 URL 開頭明確的指定 file://,那麼 Git 的行為會略有不同。 如果僅是指定路徑,Git 會嘗試使用硬連結(hard link)或直接複製所需要的檔案。 如果指定 file://,Git 會觸發平時用於網路傳輸資料的程序,那通常是傳輸效率較低的方法。 指定 file:// 的主要目的是取得一個沒有外部參考(extraneous references)或物件(object)的乾淨版本庫副本– 通常是在從其他版本控制系統匯入後或一些類似情況(參見 Git 內部原理 for maintenance tasks)需要這麼做。 在此我們將使用普通路徑,因為這樣通常更快。

要增加一個本地版本庫到現有的 Git 專案,可以執行如下的命令:

$ git remote add local_proj /opt/git/project.git

然後,就可以像在網路上一樣從遠端版本庫推送和拉取更新了。

優點
基於檔案系統的版本庫的優點是簡單,並且直接使用了現有的檔案許可權和網路訪問許可權。 如果你的團隊已經有共享檔案系統,建立版本庫會十分容易。 只需要像設定其他共享目錄一樣,把一個裸版本庫的副本放到大家都可以訪問的路徑,並設定好讀/寫的許可權,就可以了, 我們會在 在伺服器上搭建 Git 討論如何匯出一個裸版本庫。

這也是快速從別人的工作目錄中拉取更新的方法。 如果你和別人一起合作一個專案,他想讓你從版本庫中拉取更新時,執行類似 git pull /home/john/project 的命令比推送到服務再取回簡單多了。

缺點
這種方法的缺點是,通常共享檔案系統比較難配置,並且比起基本的網路連線訪問,這不方便從多個位置訪問。 如果你想從家裡推送內容,必須先掛載一個遠端磁碟,相比網路連線的訪問方式,配置不方便,速度也慢。

值得一提的是,如果你使用的是類似於共享掛載的檔案系統時,這個方法不一定是最快的。 訪問本地版本庫的速度與你訪問資料的速度是一樣的。 在同一個伺服器上,如果允許 Git 訪問本地硬碟,一般的通過 NFS 訪問版本庫要比通過 SSH 訪問慢。

最終,這個協議並不保護倉庫避免意外的損壞。 每一個使用者都有“遠端”目錄的完整 shell 許可權,沒有方法可以阻止他們修改或刪除 Git 內部檔案和損壞倉庫。

HTTP 協議

Git 通過 HTTP 通訊有兩種模式。 在 Git 1.6.6 版本之前只有一個方式可用,十分簡單並且通常是隻讀模式的。 Git 1.6.6 版本引入了一種新的、更智慧的協議,讓 Git 可以像通過 SSH 那樣智慧的協商和傳輸資料。 之後幾年,這個新的 HTTP 協議因為其簡單、智慧變的十分流行。 新版本的 HTTP 協議一般被稱為“智慧” HTTP 協議,舊版本的一般被稱為“啞” HTTP 協議。 我們先了解一下新的“智慧” HTTP 協議。

智慧(Smart) HTTP 協議
“智慧” HTTP 協議的執行方式和 SSH 及 Git 協議類似,只是執行在標準的 HTTP/S 埠上並且可以使用各種 HTTP 驗證機制,這意味著使用起來會比 SSH 協議簡單的多,比如可以使用 HTTP 協議的使用者名稱/密碼的基礎授權,免去設定 SSH 公鑰。

智慧 HTTP 協議或許已經是最流行的使用 Git 的方式了,它即支援像 git:// 協議一樣設定匿名服務,也可以像 SSH 協議一樣提供傳輸時的授權和加密。 而且只用一個 URL 就可以都做到,省去了為不同的需求設定不同的 URL。 如果你要推送到一個需要授權的伺服器上(一般來講都需要),伺服器會提示你輸入使用者名稱和密碼。 從伺服器獲取資料時也一樣。

事實上,類似 GitHub 的服務,你在網頁上看到的 URL (比如, https://github.com/schacon/simplegit[]),和你在克隆、推送(如果你有許可權)時使用的是一樣的。

啞(Dumb) HTTP 協議
如果伺服器沒有提供智慧 HTTP 協議的服務,Git 客戶端會嘗試使用更簡單的“啞” HTTP 協議。 啞 HTTP 協議裡 web 伺服器僅把裸版本庫當作普通檔案來對待,提供檔案服務。 啞 HTTP 協議的優美之處在於設定起來簡單。 基本上,只需要把一個裸版本庫放在 HTTP 根目錄,設定一個叫做 post-update 的掛鉤就可以了(見 Git 鉤子)。 此時,只要能訪問 web 伺服器上你的版本庫,就可以克隆你的版本庫。 下面是設定從 HTTP 訪問版本庫的方法:

$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update

這樣就可以了。 Git 自帶的 post-update 掛鉤會預設執行合適的命令(git update-server-info),來確保通過 HTTP 的獲取和克隆操作正常工作。 這條命令會在你通過 SSH 向版本庫推送之後被執行;然後別人就可以通過類似下面的命令來克隆:

$ git clone https://example.com/gitproject.git

這裡我們用了 Apache 裡設定了常用的路徑 /var/www/htdocs,不過你可以使用任何靜態 web 伺服器 —— 只需要把裸版本庫放到正確的目錄下就可以。 Git 的資料是以基本的靜態檔案形式提供的(詳情見 Git 內部原理)。

通常的,會在可以提供讀/寫的智慧 HTTP 服務和簡單的只讀的啞 HTTP 服務之間選一個。 極少會將二者混合提供服務。

優點
我們將只關注智慧 HTTP 協議的優點。

不同的訪問方式只需要一個 URL 以及伺服器只在需要授權時提示輸入授權資訊,這兩個簡便性讓終端使用者使用 Git 變得非常簡單。 相比 SSH 協議,可以使用使用者名稱/密碼授權是一個很大的優勢,這樣使用者就不必須在使用 Git 之前先在本地生成 SSH 金鑰對再把公鑰上傳到伺服器。 對非資深的使用者,或者系統上缺少 SSH 相關程式的使用者,HTTP 協議的可用性是主要的優勢。 與 SSH 協議類似,HTTP 協議也非常快和高效。

你也可以在 HTTPS 協議上提供只讀版本庫的服務,如此你在傳輸資料的時候就可以加密資料;或者,你甚至可以讓客戶端使用指定的 SSL 證書。

另一個好處是 HTTP/S 協議被廣泛使用,一般的企業防火牆都會允許這些埠的資料通過。

缺點
在一些伺服器上,架設 HTTP/S 協議的服務端會比 SSH 協議的棘手一些。 除了這一點,用其他協議提供 Git 服務與 “智慧” HTTP 協議相比就幾乎沒有優勢了。

如果你在 HTTP 上使用需授權的推送,管理憑證會比使用 SSH 金鑰認證麻煩一些。 然而,你可以選擇使用憑證儲存工具,比如 OSX 的 Keychain 或者 Windows 的憑證管理器。 參考 憑證儲存 如何安全地儲存 HTTP 密碼。

SSH 協議

架設 Git 伺服器時常用 SSH 協議作為傳輸協議。 因為大多數環境下已經支援通過 SSH 訪問 —— 即時沒有也比較很容易架設。 SSH 協議也是一個驗證授權的網路協議;並且,因為其普遍性,架設和使用都很容易。

通過 SSH 協議克隆版本庫,你可以指定一個 ssh:// 的 URL:

$ git clone ssh://[email protected]/project.git

或者使用一個簡短的 scp 式的寫法:

$ git clone [email protected]:project.git

你也可以不指定使用者,Git 會使用當前登入的使用者名稱。

優勢
用 SSH 協議的優勢有很多。 首先,SSH 架設相對簡單 —— SSH 守護程序很常見,多數管理員都有使用經驗,並且多數作業系統都包含了它及相關的管理工具。 其次,通過 SSH 訪問是安全的 —— 所有傳輸資料都要經過授權和加密。 最後,與 HTTP/S 協議、Git 協議及本地協議一樣,SSH 協議很高效,在傳輸前也會盡量壓縮資料。

缺點
SSH 協議的缺點在於你不能通過他實現匿名訪問。 即便只要讀取資料,使用者也要有通過 SSH 訪問你的主機的許可權,這使得 SSH 協議不利於開源的專案。 如果你只在公司網路使用,SSH 協議可能是你唯一要用到的協議。 如果你要同時提供匿名只讀訪問和 SSH 協議,那麼你除了為自己推送架設 SSH 服務以外,還得架設一個可以讓其他人訪問的服務。

Git 協議

接下來是 Git 協議。 這是包含在 Git 裡的一個特殊的守護程序;它監聽在一個特定的埠(9418),類似於 SSH 服務,但是訪問無需任何授權。 要讓版本庫支援 Git 協議,需要先建立一個 git-daemon-export-ok 檔案 —— 它是 Git 協議守護程序為這個版本庫提供服務的必要條件 —— 但是除此之外沒有任何安全措施。 要麼誰都可以克隆這個版本庫,要麼誰也不能。 這意味著,通常不能通過 Git 協議推送。 由於沒有授權機制,一旦你開放推送操作,意味著網路上知道這個專案 URL 的人都可以向專案推送資料。 不用說,極少會有人這麼做。

優點
目前,Git 協議是 Git 使用的網路傳輸協議裡最快的。 如果你的專案有很大的訪問量,或者你的專案很龐大並且不需要為寫進行使用者授權,架設 Git 守護程序來提供服務是不錯的選擇。 它使用與 SSH 相同的資料傳輸機制,但是省去了加密和授權的開銷。

缺點
Git 協議缺點是缺乏授權機制。 把 Git 協議作為訪問專案版本庫的唯一手段是不可取的。 一般的做法裡,會同時提供 SSH 或者 HTTPS 協議的訪問服務,只讓少數幾個開發者有推送(寫)許可權,其他人通過 git:// 訪問只有讀許可權。 Git 協議也許也是最難架設的。 它要求有自己的守護程序,這就要配置 xinetd 或者其他的程式,這些工作並不簡單。 它還要求防火牆開放 9418 埠,但是企業防火牆一般不會開放這個非標準埠。 而大型的企業防火牆通常會封鎖這個埠。

相關推薦

git: git協議 (本地協議HTTP 協議SSH協議 Git 協議)

到目前為止,你應該已經有辦法使用 Git 來完成日常工作。 然而,為了使用 Git 協作功能,你還需要有遠端的 Git 倉庫。 儘管在技術上你可以從個人倉庫進行推送(push)和拉取(pull)來修改內容,但不鼓勵使用這種方法,因為一不留心就很容易弄混其

URL訪問網站的過程(三次握手次揮手),傳送RST包的情況,常用協議

URL訪問網站(三次握手、四次揮手) 1)獲得域名所對應的IP地址,若DNS快取中沒有相關資料,則IE瀏覽器向DNS伺服器發出DNS請求,以獲取域名所對應的IP地址。 2)IE瀏覽器與域名地址建立TCP連線,三次握手 3)http訪問 4)斷開TCP連線,四次揮手

Git的使用--如何將本地專案上傳到Github(兩簡單方便的方法)

將本地專案上傳到Github(兩種簡單、方便的方法) 一、第一種方法: 首先你需要一個github賬號,所有還沒有的話先去註冊吧! https://github.com/ 我們使用git需要先安裝git工具,這裡給出下載地址,下載後一路直

wifi技術從瞭解到熟悉1----概念802.11協議簡述及主要物理元件wifi適配層wap_supplicant和wap_cli

1        WLAN技術 WLAN是英文WirelessLAN的縮寫,就是無線區域網的意思。無線乙太網技術是一種基於無線傳輸的區域網技術,與有線網路技術相比,具有靈活、建網迅速、個人化等特點。將這一技術應用於電信網的接入網領域,能夠方便、靈活地為使用者提供網路接入,

web服務-1http協議的三次握手次揮手

sof close 基本 通信 無法 mage 數據 web 發送 知識點:http協議:它是基於tcp協議的,瀏覽器訪問服務器,服務器把資源回給瀏覽器,這個過程都是遵循http協議的,否則無法完成,http早些年是1.0版本,現在基本上都是1.1版本了,倆個版本的區別就是

git 個區五狀態

img 推送 include comm 增刪 stage pos hash local 一張圖看明白Git的四個區五種狀態 五種狀態間的順序操作 四個區 工作區(Working Area) 暫存區(Stage) 本地倉庫(Local Repository)

視訊會議常用的網路協議方式

視訊會議以操作簡便、高效及低廉的價格受到很多人的青睞,很多企業都有佈置視訊會議系統來加強內部交流。作為憑藉網路進行資料資訊傳輸的操作體系,視訊會議系統在建設過程中,涉及到相關協議標準還是較多的,下面為大家介紹一網路進行資料傳輸的視訊會議系統網路接入的四種形式。 (視訊會議) 1、普通寬頻AD

hdlc協議解碼的方法

hdlc協議規定了,在hdlc中不能出現連續的6個1,因為這是hdlc幀的分割標誌,因此在編碼的時候每遇到5個連續的1就插入0,因此解碼時就需要碰到5個連續的1就要去掉後面的0,而在我們的計算機中都是以整數字節描述資訊,因此造成了用pc解hdlc的不便。 第一種,使用最原始

HTTP協議交互方法學習

-s 方法學 tps style 數字 get 放置 服務 冪等 一、Get Get用於獲取信息,註意,他只是獲取、查詢數據,也就是說它不會修改服務器上的數據。而根據HTTP規範, 獲取信息的過程是安全和冪等的。GET請求的數據會附在URL之後,以“?”分割URL和傳輸數據

git diff 比較方式

工作場景 在用git進行版本控制的時候,通常會有這樣的需求: 1.我想知道我的工作目錄中都發生了那些變化,以輔助我的commit操作。 2.當要真正進行提交時,我需要清楚將要提交的內容和版本庫的內容有哪些不同,這樣的提交是正確的嗎。 3.在線上程式碼出現

Tcp的定時器和三次握手次揮手協議

TCP使用四種定時器(Timer,也稱為“計時器”): 重傳計時器(Retransmission Timer)  堅持計時器(Persistent Timer)  保活計時器(Keeplive Timer)  時間等待計時器(Time_Wait Timer)  (1)重傳計時器: 重傳定時器:為了控制丟

網路篇——七層協議協議TCPHTTPSOCKET長短連線

一、From:http://thisliy.javaeye.com/blog/710122http://wenku.baidu.com/view/14a30d0102020740be1e9b84.html (TCP+HTTP工作機制)相信不少初學手機聯網開發的朋友都想知道Http與Socket連線究竟有什麼區

Tomcat的基於HTTP協議的Connector效能比較

connectionTimeout="20000"                redirectPort="8443"/> <Connector executor="tomcatThreadPool"                port="8081" pro

git 本地提交未推送 不小心遷出刪除後 的找回方法!

使用Git進行本地提交後,未上傳提交,卻不小心刪除了本地提交或提交所在分支,怎麼辦????? 不要緊!!!! 可以使用git reflog命令來幫助恢復刪除的本地提交! 執行以下命令你就知道怎麼用了! git stash 清空工作區和暫存區 git p

Git總結筆記3-把本地倉庫推送到github

-c don gin 目的 commit 筆記 pre git from 說明:此筆記在centos 7 上完成 1.配置公鑰 [[email protected]/* */ ~]# ssh-keygen -t rsa -C "[email 

linux下wget命令,支持斷點續傳,ftphttphttps等協議

strong 工作 等待 命名 wget命令 source cmd itl 操作 轉載的地址:http:[email protected]/* *//blog/static/32097310201171833420905/ 今天操作遠端機器的時候發現少一個安裝

Git 恢復誤刪除的本地倉庫文件

信息 倉庫 rm git commit 在工作中使用首先使用git add *添加文件到本地倉庫裏,git commit -m "****"之後發現添加了一些自己不想提交的代碼;所以使用了git rm *~刪除了本地倉庫裏所有add的文件,最後發現本地代碼也沒有了,怎麽辦? 1、首先使用

SQL的連接-左外連接右外連接內連接全連接

條件 title str 記錄 數據表 right 相同 arc 所有 SQL的四種連接-左外連接、右外連接、內連接、全連接 今天在看一個遺留系統的數據表的時候發現平時查找的視圖是FULL OUT JOIN的,導致平時的數據記錄要進行一些限制性處理,其實也可以設

創建局域網內遠程git倉庫,並將本地倉庫push推到遠程倉庫中

目錄 html fatal targe images rem url already tle 轉自原文 創建局域網內遠程git倉庫,並將本地倉庫push推到遠程倉庫中 1. 先遠程登錄局域網內服務器 2. 在服務器裏 切換到某個文件夾下, 然後新建一個

分組加密的模式(ECBCBCCFBOFB)

奇偶校驗位 strong word text change 相同 分組 mes 這一 加密一般分為對稱加密(Symmetric Key Encryption)和非對稱加密(Asymmetric Key Encryption)。 對稱加密又分為分組加密和序列pass