讓我來教你如何搭建屬於自己的git伺服器
準備:
一臺Linux伺服器(本文示例使用的是阿里雲CentOS 7.0)
一些做客戶端的你可能不知道的姿勢:
Linux使用者、組、許可權問題以及命令的用法
SSH協議相關
其實,這些姿勢在《鳥哥的Linux私房菜》一書中有非常詳盡的解釋,非常推薦。但是通讀此書對我們來說時間成本略高。而且如果不是每天都要用真的很難記住。所以,本文只簡單介紹這些你在搭建git伺服器的過程中可能需要了解的姿勢。
閒話少說,書歸正傳。
我們預設你有一臺Linux伺服器,並且知道root帳號和密碼,以下所有命令中需要替換的部分我會用中文佔為,真正的Linux命令是不可能有中文的。#->代表命令提示符。
首先,我們需要使用終端連結到伺服器:
#-> ssh 你的伺服器IP
之後,伺服器會提示你輸入賬號和密碼。此處需要輸入root的賬號和密碼,因為我們要在伺服器上安裝git以及建立相關使用者,需要用到root許可權。
相關姿勢一,ssh命令、協議:
ssh命令表示連線到伺服器,可以以域名為引數,或者以伺服器IP為引數。如果伺服器ssh協議監聽埠不是預設的22需要加上-p選項後邊輸入要連線伺服器的埠號。
ssh協議參見維基百科:https://zh.wikipedia.org/wiki/Secure_Shell
登入成功後,我們首先要安裝git,有的伺服器預設是已經安裝的:
#-> yum install git
yum這裡就不詳細介紹了,它是一款安裝軟體的工具,會自動下載依賴包,免得我們自己到處找。並且自動安裝軟體。
安裝完畢,我們需要先建立使用者組,建立使用者組的目的其實是為了控制某一類使用者的許可權。假設我們需要為設計部搭建一個git伺服器,那我們此處需要輸入命令:
#-> groupadd 組名稱
建立組完成後我們需要建立幾個不同的使用者:
#-> useradd -M 使用者名稱稱1
#-> useradd -M 使用者名稱稱2
... ...
建立好使用者之後我們還需要把使用者新增到之前建立的組中:
#-> usermod -G 組名稱 使用者名稱稱1
#-> usermod -G 組名稱 使用者名稱稱2
... ...
useradd是新增系統使用者的命令,如果不加-M的選項則建立使用者的時候會自動在/home目錄下建立一個和使用者名稱相同的目錄,這個目錄通常被稱作該使用者的家目錄,該使用者在該目錄下擁有讀寫許可權。許可權問題會在後邊進一步介紹。在此,我們的目的是搭建git伺服器,並不想給使用者除了git訪問以外其他的許可權,所以這裡使用-M選項讓系統不給該使用者建立自己的家目錄。
usermod是使用者管理命令,-G表示將使用者新增到某個分組。
為了保留祕鑰登入的驗證資訊,所以我們在/home目錄下建立一個公共家目錄:
#-> midair 組目錄名稱
我們還需要禁用掉其他使用者ssh到伺服器,只留給使用者git相關許可權,並且修改使用者的家目錄:
#-> vim /etc/passwd
找到所建立使用者的這一行:
使用者名稱稱:x:1000:1000::/home/使用者名稱稱:/bin/bash
將/bin/bash替換成git-shell的路徑(我的伺服器是:/usr/bin/git-shell,可以通過#-> which git-shell來檢視git-shell所在路徑)
將/home/使用者名稱稱替換成/home/組目錄名稱
我們再次進入公共的家目錄:
#-> cd /home/組目錄名稱
建立我們想要的git倉庫:
#-> mkdir 新倉庫名稱.git
進入該目錄:
#-> cd 新倉庫名稱.git
使用git命令來建立一個裸倉庫:
#-> git --bare unit
至此,我們已經在伺服器上完成了一個git倉庫的建立。我們可以在客戶端clone該倉庫:
#-> git clone 剛剛建立的使用者名稱稱@你的伺服器IP:新倉庫名稱.git
雖然已經clone出倉庫,但是這時候我們是不能push的,因為新建立的使用者此時並沒有寫許可權,我們需要回到伺服器:
#-> cd /home
修改組目錄所屬的分組:
#-> chgrp -R 組目錄名稱
-R表示遞迴修改所有子目錄所屬分組
然後修改組目錄的許可權:
#-> chmod -R 775 組目錄名稱
這裡-R同樣表示遞迴修改許可權
775表示許可權,Linux下檔案/資料夾許可權分為三種,檔案擁有者許可權、檔案所屬組成員許可權、以及其他人的許可權。775三位分別對應這三種許可權。每一位中,4表示可讀,2表示可寫,1表示可執行(資料夾的話表示可進入),最後相加的和表示許可權集合。這裡我們設定為組目錄以及子目錄的許可權為775表示所擁有者可讀、可寫、可執行;所屬組成員可讀、可寫、可執行;其他人可讀、可執行,但是不可寫。
此時我們再次回到客戶端,就可以push倉庫的修改到伺服器了。