搭建Git伺服器

備註:

本文參考於廖雪峰老師的部落格Git教程。依照其部落格進行學習和記錄,感謝其無私分享,也歡迎各位查看原文。

知識點

  • apt-get install git安裝git,創建用戶adduser username

  • 新用戶家(home)目錄下.shh/authorized_keys存放管理連接到Git遠程倉庫的用戶的私鑰。

  • git init --bare reponame.git創建一個空的遠程倉庫,並將此遠程倉庫所在目錄及子目錄的擁有者設置為新用戶,chown -R username:usernameGroup sample.git/

  • 修改/etc/passwd文件,禁用用戶shell終端登陸。

搭建Git伺服器

Git遠程倉庫本質上和本地倉庫沒有任何區別,只是它能提供永久在線服務

如下演示在Ubuntu上搭建Git伺服器

  • 安裝git:
$ sudo apt-get install git
  • 創建一個git用戶,用來運行git服務
$ sudo adduser git

使用passwd git為git用戶修改密碼。

  • 創建證書登陸

創建證書登陸,和在使用githubgitee時,將公鑰上傳到遠程伺服器上一樣,Git伺服器需要搜集需要登陸的用戶端的公鑰(用戶創建的id_rsa.pub),

搜集所有需要登陸的用戶的公鑰,即用戶的id_rsa.pub文件。把公鑰導入到/home/git/.ssh/authorized_keys文件里,一行一個。

默認新建的git用戶家(home)目錄,沒有.ssh隱藏目錄。可手動創建目錄和文件。

新建一個用戶,其家目錄下面默認生成的文件由/etc/skel目錄裡面的內容決定(可自行驗證)。

同時Ubuntu下新建用戶,家(home)目錄下的桌面等目錄需要使用新用戶登陸ubuntu桌面後,才會會生成桌面、圖片、文檔、下載、音樂等目錄。

  • 初始化Git倉庫:

選定一個目錄作為Git倉庫,假設為/srv/sample.git,在/src目錄下輸入命令

$ sudo git init --bare sample.git
[sudo] git 的密碼:
初始化空的 Git 倉庫於 /srv/sample.git/

Git會創建一個空的倉庫,且沒有工作區,只用於共享,所以不應讓用戶直接登陸到伺服器修改工作區。

伺服器Git倉庫通常.git結尾。

  • 將目錄的所有者改為git
$ sudo chown -R git:git sample.git/
  • 禁用git用戶shell登陸

處於安全考慮,新建的git用戶不允許登陸shell。通過編輯/etc/passwd文件設置。

打開passwd文件找到如下行:

git:x:1001:1002:,,,:/home/git:/bin/bash

將其修改為

git:x:1001:1002:,,,:/home/git:/usr/bin/git-shell

此時使用git登陸,將會不允許

$ su git
密碼:
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.

su命令用來切換登陸用戶

sudo用來獲取root管理員許可權,執行命令

su [username] 切換到指定用戶,不改變環境變數

su - [username] 切換並改變環境變數為指定用戶(常用)

git用戶可以正常通過ssh使用git,但無法登陸shell,因為為git用戶指定的git-shell每次一登錄就自動退出。

  • 克隆遠程倉庫。

現在就可通過git clone將遠程倉庫/srv/sample.git/克隆下來。

可以設定一個伺服器名訪問克隆遠程倉庫。如將gitsever設置到本地hosts中,ip為Git伺服器的地址。

$ git clone git@gitsever:/srv/sample.git
Cloning into 'sample'...
The authenticity of host 'gitsever (192.168.104.237)' can't be established.
ECDSA key fingerprint is SHA256:SYG7vL********************y597FA.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitsever,192.168.104.237' (ECDSA) to the list of known hosts.
warning: You appear to have cloned an empty repository.

會提示克隆了一個空的git倉庫,查看倉庫內容。

$ cd sample/

/sample (master)$ ls -al
total 4
drwxr-xr-x 1 win7hostsver 197121 0 May  4 14:29 .
drwxr-xr-x 1 win7hostsver 197121 0 May  4 14:29 ..
drwxr-xr-x 1 win7hostsver 197121 0 May  4 14:29 .git

之後可以使用這個遠程庫進行git的操作、同步等。

公鑰的管理

如上,一個簡單的git伺服器已經搭建完成。然後可以添加其他的倉庫、其他用戶的公鑰等進行管理。

  • 公鑰路徑位置:/home/git/.ssh/authorized_keys

但是對於大型或者多人使用和管理的git伺服器,可以使用Gitosis管理公鑰。

git伺服器倉庫的許可權管理

git本身是為了託管linux程式碼而開發的,所以注重開源精神,不支援許可權控制。

但Git提供了相關的鉤子(hook),可以藉此編寫一系列腳本來控制對倉庫的提交等操作,從而實現控制許可權。Gitolite就是一個提供管理許可權的工具,有需要可深入了解