CentOS Linux release 7.5.1804 (Core) html
最基本的就是 本地協議(Local protocol) ,其中的遠程版本庫是硬盤內的一個目錄。這常見於團隊每個成員都對一個共享的文件系統(例如一個掛載的 NFS)擁有訪問權,或者比較少見的多人共用同一臺電腦的狀況。後者並不理想,由於你的全部代碼版本庫若是長存於同一臺電腦,更可能發生災難性的損失。linux
若是你使用共享文件系統,就能夠從本地版本庫克隆(clone)、推送(push)以及拉取(pull)。像這樣去克隆一個版本庫或者增長一個遠程到現有的項目中,使用版本庫路徑做爲 URL。例如,克隆一個本地版本庫,能夠執行以下的命令
$ git clone /opt/git/project.git
或你能夠執行這個命令:
$ git clone file:///opt/git/project.gitgit
若是在 URL 開頭明確的指定 file:// ,那麼 Git 的行爲會略有不一樣。若是僅是指定路徑,Git 會嘗試使用硬連接(hard link)或直接複製所須要的文件。若是指定 file:// ,Git 會觸發平時用於網路傳輸資料的進程,那一般是傳輸效率較低的方法。指定 file:// 的主要目的是取得一個沒有外部參考(extraneous references)或對象(object)的乾淨版本庫副本– 一般是在從其餘版本控制系統導入後或一些相似狀況須要這麼作。在此咱們將使用普通路徑,由於這樣一般更快。要增長一個本地版本庫到現有的 Git 項目,能夠執行以下的命令:github
$ git remote add local_proj /opt/git/project.gitweb
而後,就能夠像在網絡上同樣從遠端版本庫推送和拉取更新了。
優勢
基於文件系統的版本庫的優勢是簡單,而且直接使用了現有的文件權限和網絡訪問權限。若是你的團隊已經有共享文件系統。只須要像設置其餘共享目錄同樣,把一個裸版本庫的副本放到你們均可以訪問的路徑,並設置好讀/寫的權限,就能夠了。這也是快速從別人的工做目錄中拉取更新的方法。若是你和別人一塊兒合做一個項目,他想讓你從版本庫中拉取更新時,運行相似 shell
git pull /home/john/project 的命令比推送到服務再取回簡單多了。vim
缺點
這種方法的缺點是,一般共享文件系統比較難配置,而且比起基本的網絡鏈接訪問,這不方便從多個位置訪問。若是你想從家裏推送內容,必須先掛載一個遠程磁盤,相比網絡鏈接的訪問方式,配置不方便,速度也慢。值得一提的是,若是你使用的是相似於共享掛載的文件系統時,這個方法不必定是最快的。訪問本地版本庫的速度與你訪問數據的速度是同樣的。在同一個服務器上,若是容許 Git 訪問本地硬盤,通常的經過NFS 訪問版本庫要比經過 SSH 訪問慢。最終,這個協議並不保護倉庫避免意外的損壞。每個用戶都有「遠程」目錄的完整 shell 權限,沒有方法能夠阻止他們修改或刪除 Git 內部文件和損壞倉庫。安全
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的掛鉤就能夠了。此時,只要能訪問 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 的數據是以基本的靜態文件形式提供的。一般的,會在能夠提供讀/寫的智能 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 密碼。
架設 Git 服務器時經常使用 SSH 協議做爲傳輸協議。由於大多數環境下已經支持經過 SSH 訪問 —— 即便沒有也比較很容易架設。SSH 協議也是一個驗證受權的網絡協議;而且,由於其廣泛性,架設和使用都很容易。經過 SSH 協議克隆版本庫,你能夠指定一個 ssh:// 的 URL:
$ git clone ssh://user@server/project.git
或者使用一個簡短的 scp 式的寫法:
$ git clone user@server:project.git
你也能夠不指定用戶,Git 會使用當前登陸的用戶名。
優點
用 SSH 協議的優點有不少。首先,SSH 架設相對簡單 —— SSH 守護進程很常見,多數管理員都有使用經驗,而且多數操做系統都包含了它及相關的管理工具。其次,經過 SSH 訪問是安全的 —— 全部傳輸數據都要通過受權和加密。最後,與 HTTP/S 協議、Git 協議及本地協議同樣,SSH 協議很高效,在傳輸前也會盡可能壓縮數據。
缺點
SSH 協議的缺點在於你不能經過他實現匿名訪問。即使只要讀取數據,使用者也要有經過 SSH 訪問你的主機的權限,這使得 SSH 協議不利於開源的項目。若是你只在公司網絡使用,SSH 協議多是你惟一要用到的協議。若是你要同時提供匿名只讀訪問和 SSH 協議,那麼你除了爲本身推送架設 SSH 服務之外,還得架設一個可讓其餘人訪問的服務。
Git 協議是包含在 Git 裏的一個特殊的守護進程;它監聽在一個特定的端口(9418),相似於 SSH 服務,可是訪問無需任何受權。要讓版本庫支持 Git 協議,須要先建立一個git-daemon-export-ok 文件 —— 它是 Git 協議守護進程爲這個版本庫提供服務的必要條件 ——可是除此以外沒有任何安全措施。要麼誰均可以克隆這個版本庫,要麼誰也不能。這意味這,一般不能經過 Git 協議推送。因爲沒有受權機制,一旦你開放推送操做,意味着網絡上知道這個項目 URL 的人均可以向項目推送數據(因此通常不會使用)。
優勢
目前,Git 協議是 Git 使用的網絡傳輸協議裏最快的。若是你的項目有很大的訪問量,或者你的項目很龐大而且不須要爲寫進行用戶受權,架設 Git 守護進程來提供服務是不錯的選擇。它使用與 SSH 相同的數據傳輸機制,可是省去了加密和受權的開銷。
缺點
Git 協議缺點是缺少受權機制。把 Git 協議做爲訪問項目版本庫的惟一手段是不可取的。通常的作法裏,會同時提供 SSH 或者 HTTPS 協議的訪問服務,只讓少數幾個開發者有推送(寫)權限,其餘人經過git:// 訪問只有讀權限。Git 協議也許也是最難架設的。它要求有本身的守護進程,這就要配置xinetd 或者其餘的程序,這些工做並不簡單。它還要求防火牆開放 9418 端口,可是企業防火牆通常不會開放這個非標準端口。而大型的企業防火牆一般會封鎖這個端口。
一、安裝Samba服務
yum install -y samba
二、建立Samba用戶
2.1建立本地用戶
[root@bogon ~]# useradd git_user_read # 只讀用戶 [root@bogon ~]# useradd git_user_write # 只寫用戶
2.2映射Samba用戶
[root@bogon ~]# pdbedit -a git_user_read new password: # 輸入密碼 retype new password: # 確認密碼 Unix username: git_user_read ... [root@bogon ~]# pdbedit -a git_user_write new password: # 輸入密碼 retype new password: # 確認密碼 Unix username: git_user_read ...
三、關閉SELinux
vi /etc/selinux/config 將SELINUX=enforcing改成SELINUX=disabled # 重啓生效
四、建立共享目錄
[root@web ~]# mkdir /home/git_root/ [root@web ~]# chmod -R 777 /home/git_root
五、配置Samba
[root@web ~]# vim /etc/samba/smb.conf [git_dir] path = /home/git_root/ # git 根目錄 comment = this is git root directory valid users = git_user_write git_user_read # 可讀用戶 write list = git_user_write # 可寫用戶
其它配置默認便可,咱們只需在文件的最後加上上述代碼塊便可。而後開啓Samba服務:
[root@web ~]# systemctl start smb [root@web ~]# systemctl start nmb
六、驗證Samba配置
這裏最好把防火牆關閉了,要否則有可能會出問題。
[root@web ~]# systemctl stop firewalld
驗證主機:
本機 Windows 7 使用git_user_read用戶登錄
虛擬主機 Centos 7 192.168.10.129 使用git_user_write用戶登錄
由上面簡單的動畫咱們能夠看出git_user_read用戶只有讀取的權限,git_user_write用戶有寫入的權限。說明咱們Samba的配置沒有問題。下面咱們開始真正進入正題
七、初始化git倉庫
登錄咱們的git服務器Centos 7 192.168.10.10,在/home/git_root/下建立咱們的git倉庫,這裏咱們建立了一個damo_repo。
[root@web git_root]# mkdir damo_repo [root@web git_root]# git init --bare damo_repo/ [root@web git_root]# chmod -R 777 damo_repo/
7.1clone遠程倉庫
這裏我使用本機Windows 7 ,在個人I盤中新建了一個git_repo用於存放從git服務器拉取的數據,而後在」控制面板--憑據管理器「中添加訪問憑據。
這裏我添加的是git_user_write用戶,由於它有寫入權限。
$ git clone //192.168.10.10/git_dir/damo_repo
clone成功後咱們會看到以下:
咱們在倉庫中隨便建立個test.html文件,以下操做:
test.html文件簡單寫個<h1>This is test</h1> $ git add . $ git commit -m 'test' $ git push -u origin master
7.2使用192.168.10.129客戶端驗證。
因爲192.168.10.129是Centos 7,咱們的git服務器時基於Samba作的。因此這裏須要在192.168.10.129上掛載192.168.10.10服務器上的git倉庫。
以下操做:
[root@web home]# mount -t cifs -o username=git_user_read,password=123 //192.168.10.10/git_dir/ /mnt/ [root@web home]# mkdir git_repo # 在home目錄下建立git_repo用於存儲git項目 [root@web home]# cd git_repo/ [root@web git_repo]# git clone file:///mnt/damo_repo/ # 獲取git倉庫中的項目
而後咱們會看到以下界面;
下面咱們建立一個文件嘗試推送查看是否能夠
[root@web damo_repo]# vim abc.sh echo 'Hello World' [root@web damo_repo]# git add . [root@web damo_repo]# git commit -m 'abc' [root@web damo_repo]# git push -u origin master # 推送失敗 Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 309 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: error: insufficient permission for adding an object to repository database ./objects remote: fatal: failed to write object error: unpack failed: unpack-objects abnormal exit To file:///mnt/damo_repo/ ! [remote rejected] master -> master (unpacker error) error: 沒法推送一些引用到 'file:///mnt/damo_repo/'
失敗的緣由是Samba權限的問題。git_user_read用戶只有讀取的權限,沒有寫入的權限。
小結:
若是Git服務器是本機,使用git clone file:///倉庫地址。
若是Git服務器不是本機,本機是Windows,在控制面板中的憑證管理器中添加git服務器地址,用戶名和密碼。而後使用git clone //192.168.10.10/倉庫。
若是Git服務器不是本機,本機是linux,須要使用mount命令將git服務器倉庫關在到本機,而後使用git clone file:///本地掛載位置 。
未完待續。。。。。。。。。。。。。。