搭建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用戶修改密碼。
- 創建證書登陸
創建證書登陸,和在使用github
或gitee
時,將公鑰上傳到遠程伺服器上一樣,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就是一個提供管理許可權的工具,有需要可深入了解