前言
在個人VPS上安裝git服務。 本文的所有內容都是在阿里雲ECS的ubuntu 14.04的系統下進行的。
背景
公司本部的開發專案可不能放在Github的開源倉庫上,放私有倉庫又需要一定的花費,崇尚自由的Coder怎麼能就這樣被束縛了呢?果斷想到把原始碼就放在公司的伺服器上,而且還要加上版本管理工具,最好就是Git!接下來就一起來探討怎樣在伺服器上搭建Git服務,最後功能足夠豐富的話,加上前端頁面,還能像Github上一樣呢!聽起來高大上,其實什麼東西都是學會之後就很簡單。
配置伺服器
什麼資料都是開發者原版的最清晰最全面,先po上參考文章: 《Git官方文件-伺服器上的Git-配置伺服器》 其實上面的已經夠全面的了,但是對於小白來說,還是不能夠很好地理解,這裡我來補充完善。 PS: 下面約定俗成一下
終端A 是登入到遠端伺服器的git-bash或其他的終端 終端B 是本地操作的git-bash或其他的終端
在linux伺服器上安裝git工具並配置
安裝git工具:
# 更新安裝源
$ sudo apt-get update
# 安裝git工具
$ sudo apt-get install git
複製程式碼
配置git:
git config --global user.name "Your Name"
git config --global user.email "name@mailname.com"
複製程式碼
檢視git的配置資訊:
git config --list
複製程式碼
為linux伺服器新建使用者並新增SSH信任
先為你的linux伺服器新建一個git使用者,我的linux伺服器是公司租用ali的測試伺服器,先登入到root超級使用者,再操作下面的。PS: 程式碼中的使用者提示符$
看成是#
號即可,因為是root超級使用者,不寫成是#
的原因是會變成註釋
終端A
$ adduser -d /home/git -m git #沒錯,使用者名稱就是git,若不存在使用者目錄,則會建立
#輸入設定git使用者的密碼,此步驟在此不展示,建議密碼設定複雜點,畢竟是放在網上的
$ chmod 755 /home/git
$ su git
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
複製程式碼
PS1: 我們一旦新建立了使用者,就會自動在/home
目錄下新建一個與使用者名稱相應的資料夾,經過上述操作,自動新建了/home/git
資料夾,該目錄稱為git使用者的家目錄,對其他普通使用者是一樣的道理
PS2: 超級使用者root的家目錄不在/home/
下,而是/root
目錄
假定這裡我們以前都與Github建立過SSH信任,或者是閱讀過我的《一鍵部署前端程式碼到伺服器》並會建立本地SSH的祕鑰與公鑰檔案,那麼下面繼續,新開一個git-bash終端B 找到我們的id_rsa.pub公鑰檔案目錄,然後遠端拷貝到伺服器:
終端B
$ cd ~/.ssh/
$ ls ./id_rsa.pub
$ scp ./id_rsa.pub root@114.xxx.xxx.xxx:/home/git
複製程式碼
又回來終端A下繼續操作: 終端A
$ su git #切換到git使用者
$ cd /home/git #進入git使用者的家目錄
$ cat ./id_rsa.pub >> .ssh/authorized_keys #將id_rsa.pub檔案內容追加到authorized_keys中
複製程式碼
退出SSH登入,然後重新以git使用者的身份進入即可,不再需要輸入git使用者的密碼
測試是否可以免密登入:
ssh -v git@SERVER
複製程式碼
嚴重警告:
1. 必須保證git使用者的根目錄的資料夾許可權為 755
2. 必須保證git使用者的根目錄下的.ssh資料夾許可權為 700
3. 必須保證git使用者的根目錄下的.ssh資料夾中的authorized_keys檔案的許可權為 600
為新建的git使用者搭建git倉庫
以git使用者的身份遠端SSH登入伺服器:
$ ssh git@114.xxx.xxx.xxx
```linux
藉助帶 `--bare` 選項的 `git init` 命令來為開發者新建一個倉庫,該命令在初始化倉庫時不會建立工作目錄:
```sh
$ cd /home/git #新倉庫要建立在哪個資料夾自己選,方便組織管理就行,我就直接放在git使用者的家目錄下
$ mkdir testProject.git #建立一個新倉庫目錄
$ cd testProject.git #進入新倉庫目錄
$ git init --bare #初始化該新倉庫
Initialized empty Git repository in /home/git/testProject.git/
複製程式碼
至此,一個存在於自己伺服器上的git倉庫就搭建好了,該倉庫的地址就為:git@114.xxx.xxx.xxx:/home/git/testProject.git
,一看,哇靠,跟專案在github上的地址格式是一樣的!例如:git@github.com:ironmaxtory/ironmaxtory.github.io.git
,心裡著實激動!現在自己的伺服器的/home/git
就相當於一個小型簡陋的Github倉庫了,同理也能夠無限的新增新倉庫,儲存新的工程專案程式碼。
關聯操作伺服器上的git倉庫
經過上面兩個步驟,就可以關聯操作伺服器上的git倉庫並上傳儲存自己的程式碼了:
$ cd testProject #在本地先進入自己的工程程式碼根目錄
$ git remote add tsOrigin git@114.xxx.xxx.xxx:/home/git/testProject.git #新增遠端伺服器的倉庫並取暱稱為tsOrigin,區別於github上的origin倉庫
$ git push tsOrigin master #向遠端倉庫推送程式碼
複製程式碼
新增多人協作
這個場景必須有而且很常見,公司的專案程式碼一般是多人維護的;就算不是一人維護的,那你上傳到測試伺服器上的最終目的都是為了在多臺電腦上可以下載並上傳提交程式碼,所以需要新增多人協作!其實也很簡單,只需要把需要協作的PC上的SSH公鑰追加到git使用者下家目錄的授權鑰匙檔案/home/git/.ssh/authorized_keys
中即可,用cat
命令。
限制開發者遠端登入linux伺服器
需要注意的是,目前所有(獲得授權的)開發者使用者都能以系統使用者 git 的身份登入伺服器從而獲得一個普通 shell。
藉助一個名為 git-shell 的受限 shell 工具,你可以方便地將使用者 git 的活動限制在與 Git 相關的範圍內。該工具隨 Git 軟體包一同提供。 如果將 git-shell 設定為使用者 git 的登入 shell(login shell),那麼使用者 git 便不能獲得此伺服器的普通 shell 訪問許可權。 若要使用 git-shell,需要用它替換掉 bash 或 csh,使其成為系統使用者的登入 shell。 為進行上述操作,首先你必須確保 git-shell 已存在於 /etc/shells 檔案中,並將git-shell
的位置新增到/etc/shells
目錄中
$ cat /etc/shells # see if `git-shell` is already in there. If not...
$ which git-shell # make sure git-shell is installed on your system.
$ sudo vim /etc/shells # and add the path to git-shell from last command
複製程式碼
接下來可以使用chsh <username>
來修改任一系統使用者的shell:
$ sudo chsh git # and enter the path to git-shell, usually: /usr/bin/git-shell
複製程式碼
這樣,使用者 git 就只能利用 SSH 連線對 Git 倉庫進行推送和拉取操作,而不能登入機器並取得普通 shell。 如果試圖登入,你會發現嘗試被拒絕,像這樣:
$ ssh git@114.xxx.xxx.xxx
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.
複製程式碼
福利奉獻
自定義對映遠端伺服器IP地址的域名
每次遠端登入都要這樣ssh root@114.xxx.xxx.xxx
,很麻煩有沒有?!沒有配域名的而且IP地址複雜後更加噁心有沒有?!來一起配置一下對於本地的伺服器的域名!編輯/c/windows/system32/drivers/etc
目錄下的hosts
檔案,用editplus
開啟即可,如下新增一行:
114.xxx.xxx.xxx (空格) ts.aliyun.com (回車換行)
複製程式碼
儲存退出,一般來說,並不能立即生效,有如下幾種解決方案,反正我全都用了-.-
- DOS介面下
- 網路配置,新增hosts檔案
- 控制皮膚->管理工具->服務->DNS Client 修改為手動
以後就可以這樣:
ssh root@ts.aliyun.com
複製程式碼
關於我
歡迎關注 [程式猿何大叔] 公眾號
你的關注 就是我的動力