搭建本地git服務器


一、環境

CentOS Linux release 7.5.1804 (Core) 

二、git服務器通訊協議

本地協議(Local)

最基本的就是 本地協議(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 項目,可以執行如下的命令:

$ git remote add local_proj /opt/git/project.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的掛鈎就可以了。此時,只要能訪問 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 密碼。

SSH 協議

架設 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 協議是包含在 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服務器

1、安裝Samba服務

yum install -y samba

2、創建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
...

 3、關閉SELinux

vi /etc/selinux/config
將SELINUX=enforcing改為SELINUX=disabled   # 重啟生效

4、創建共享目錄

[root@web ~]# mkdir /home/git_root/
[root@web ~]# chmod -R 777 /home/git_root

5、配置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

6、驗證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的配置沒有問題。下面我們開始真正進入正題

7、初始化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用戶只有讀取的權限,沒有寫入的權限。

小結:

  • 使用的是本地協議(Samba)。
  • git倉庫的目錄權限和Samba權限配合使用對用戶權限進行管理。
  • 獲取git服務器倉庫:

    如果Git服務器是本機,使用git clone file:///倉庫地址。

    如果Git服務器不是本機,本機是Windows,在控制面板中的憑證管理器中添加git服務器地址,用戶名和密碼。然后使用git clone //192.168.10.10/倉庫。

    如果Git服務器不是本機,本機是linux,需要使用mount命令將git服務器倉庫掛載到本機,然后使用git clone file:///本地掛載位置  。


 

使用git協議搭建git服務器

未完待續。。。。。。。。。。。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM