Linux上搭建Git服務器

由於github可以免費幫我們管理項目(即項目的版本控制),因此我們通常會將一些開源項目放在github的公共倉庫。
但我們經常會有這樣的需求:出於商業目的,我們必須要項目的源文件進行保密。
這個時候再用github的私有倉庫管理我們的項目就不合適—github的私有倉庫是“收費”的。
這個時候,我們就可以考慮搭建一個私有的Git服務器。
以下是阿里雲服務器Linux作爲服務器系統,本機Windows作爲客戶端系統進行示例說明。

安裝Git

Linux上通過yum命令安裝Git

# 通過yum工具拉取並安裝最新版本的git工具包
yum install git
# 正確顯示git的版本號,則表示已經正確安裝
git --version

# 我們默認都是通過“git用戶”來管理git服務器,因此要新建一個git用戶
# 測試服務器上是否有git用戶
id git
# 如果沒有,則通過如下命令添加一個git組下的git用戶,併爲git用戶設置登錄密碼
groupadd git
useradd git
passwd git

命令執行成功後,測試效果應該如下:

git用戶的測試效果圖

Windows通過安裝包安裝Git

Git官網下載地址,下載最新版本的Git。安裝完成後配置Git的環境變量。
Git官方文檔裏面有說明,谷歌/百度也能搜到很多教程,這裏就不再贅述。
如果安裝完成並配置好了Git的環境變量,鼠標右擊後的菜單欄,可以看到Git Bash Here的選項,選擇後即可打開git的命令行工具。

在Linux服務器端創建Git倉庫

# 新建一個空白目錄blog.git,作爲Git倉庫
mkdir -p /home/gitrepo/blog.git
# 初始化倉庫,--bare表示只生成一個裸倉庫,沒有工作目錄(.git),會保存git歷史提交的版本信息。
git init --bare /home/gitrepo/blog.git
# 將該目錄的所有人改爲git用戶
cd /home/gitrepo
chown -R git:git blog.git

Windows客戶端拉取遠程倉庫

在桌面通過Git Bash Here,打開git的命令行工具,進行如下測試:

# 創建e://test目錄,作爲本地倉庫
cd e:
mkdir test
cd test
# 克隆遠程倉庫
git clone [email protected]:/home/gitrepo/blog.git
# 這段命令的含義:以git用戶的身份,拉取ip地址爲47.96.86.36的主機上目錄爲/home/gitrepo/blog.git對應遠程倉庫管理的工作目錄。這裏要鍵入的密碼就是passwd git命令爲git用戶設置的密碼。

命令執行成功後的效果圖如下:

克隆遠程倉庫的效果圖

由於我們這裏剛剛初始化Git倉庫blog.git,目前該Git倉庫管理的工作目錄中沒有任何內容,所以克隆到客戶端時,工作目錄blog中沒有任何內容。這裏的.git是隱藏目錄,裏面存放的就是本地倉庫對應的工作目錄blog的版本信息。
這裏需要注意的是:客戶端的工作目錄下新建文件,通過git push origin master命令推送到遠程倉庫後,遠程倉庫是看不到這些文件的。因爲遠程倉庫初始化時設置了參數--bare,表示不會存放源文件,只是存放工作目錄的版本信息。

設置免密

我們每次從遠端倉庫拉取最新版本的項目,或從本地往遠端推送新代碼時,都需要驗證密碼。這樣太麻煩了,Git給我們提供了一種方法來解決問題。

客戶端生成公鑰

# 在客戶端生成一對密鑰(公鑰和私鑰)
ssh-keygen -t rsa -C "[email protected]"

這個命令執行後,會在~/.ssh路徑即user/.ssh下生成如下文件,記錄裏面的公鑰文件id_rsa.pub中的內容。效果圖如下:

生成公鑰效果圖

服務器端通過RSA認證實現免密

  • 新建存放公鑰的文件
# 創建目錄.ssh
mkdir /home/git/.ssh
# 給該目錄授予權限700
chmod 700 /home/git/.ssh
# 創建文件authorized.keys
touch /home/git/.ssh/authorized.keys
# 給該文件授予權限600
chmod 600 /home/git/.ssh/authorized.key
# 由於權限設置問題(只有“文件所有人”才能操作),需要把把“文件所有人”更改爲git用戶
chown -R git:git  /home/git/.ssh/

說明:git用戶的默認根目錄是/home/git,公鑰默認是放在/home/git/.ssh/authorized.key文件裏面。
這裏需要注意的是每行放一個公鑰
因此這裏就是將客戶端生成的公鑰放在該文件authorized.key中。

  • 開啓RSA認證
vim /etc/ssh/sshd_config
# 修改sshd_config配置文件,把如下3個參數放開(如果沒有相應參數自行添加)
# RSAAuthentication yes
# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys

# 使該配置文件即時生效
systemctl restart sshd

此時,在客戶端進行push/pull等等操作就都不需要輸入密碼了。

免密的原理說明:

  • 在客戶端執行命令ssh-keygen -t rsa -C "***.com",是通過rsa算法生成了一對密鑰(一個公鑰和一個密鑰),由於這裏是根據當前客戶端的ip地址、當前時間戳等等信息生成的,保證了數據的唯一性,這也就保證了用戶認證的安全性。
  • 服務端開啓了RSA認證後,把客戶端的公鑰保存在authorized_keys文件中,也就相當於客戶端就是放在服務端的白名單中。每次客戶端通過git操作來連接服務端時,就會放行,而不需要密碼認證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章