Linux創建GIT倉庫並實現hook同步到指定目錄

(注:我的服務器是Ubuntu 16.04.3 LTS 64)

一、在服務器上安裝git

sudo apt-get install git

安裝完成之後,可運行“git --version”查看安裝版本,能看到git版本信息則說明已經安裝成功。

二、添加git用戶

有一些操作系統會在你安裝git時會同時幫你創建一個git用戶,但Ubuntu的需要我們手動來創建。這也非常簡單的,那我們就來手動創建一個git用戶:

sudo adduser git  #輸入密碼,然後其它信息默認直接回車就行。

三、在服務器上創建裸倉庫

你也可以一條命令完成上面的操作:

git --bare init carcartalk.git

裸倉庫裏面只保存了一些配置信息和你的版本庫文件等,但是看不到我們所上傳的文件或代碼的,這就是裸倉庫的特點。我們只需要能夠從裸倉庫裏clone代碼到你的本地就行。

其實裸倉庫的內容也就是我們正常git倉庫裏面的隱藏文件夾.git裏面的內容

四、在本地克隆服務器上的裸倉庫

我的客戶端是windows,我已經安裝好git了。windows上的git安裝非常簡單,上網直接百度一個git的exe文件安裝就行。如果沒有的話,我這裏也可以推薦一個git的下載鏈接:https://git-scm.com/downloads,點擊打開,選擇windows版本直接下載安裝即可,和所有的windows軟件安裝一樣,這裏我就不特別說明了。

嚴格來說,其實Git並沒有所謂的服務器端和客戶端,這也是Git和SVN最大的一點不同。不管你在哪裏創建了一個git倉庫,原理上它都可以充當一個git服務器,這取決於你的配置。深入瞭解就涉及到很多git的原理知識了,感趣興的同學可以自行去學習,當然,我也非常推薦你這樣去做。

好了,我又扯遠了,回到主題

克隆剛剛在服務器創建的裸倉庫到本地:

git clone git@服務器ip:/home/git/project/carcartalk.git carcartalk

然後輸入你的git用戶的密碼,你將會看到一個如下的“warning”提示,即說明你已經完成了克隆到本地的任務。

warning: You appear to have cloned an empty repository.

注意:很有可能你會在這個步驟收到一個權限不足的錯誤,這很有可能是因爲git用戶對你的服務器端的git倉庫目錄權限不足的原因,這裏你只要把倉庫的所屬用戶及用戶組都改爲git即可。

chown git:git -R /home/git  #正常來說,如果你是在git用戶的主目錄下創建倉庫則不會出現該問題。

這裏可能你還有一個疑問,如果我不知道git用戶的密碼呢?這該怎麼辦?(因爲把git的密碼告訴別人,那麼他就可能會登錄上你的服務器。)

其實有兩種辦法可以解決這個問題,(1)可以登錄你的root用戶,設置git用戶不可登錄服務器,這樣你把git密碼透露出去也相對沒那麼危險,但我還是推薦下一種方法;(2)通過驗證客戶端祕鑰來實現不需要密碼進行git代碼管理(等下我會在文章最後面拿這種方法來講解,這個方法用起來會相對方便很多,非常適合開發。)

五、測試使用

克隆了遠程倉庫到本地後,你可以先進行一些簡單的測試操作,確保你的git能正常使用,如下:

touch readme.txt
git add readme.txt
git commit -m"first commit"
git push origin master  # 在服務器端沒有配置祕鑰之前,每次push都要輸入密碼

第一次push可能會有一些提示,因爲裸版本庫還什麼都沒有,你可能需要 git push origin master寫全命令,之後就沒必要了,直接 git push 就可以了。

六、設置git鉤子

就比如一個web服務器,當我們在本地把開發好的代碼文件push到服務器時,只是把更新提交到了你一開始在服務器創建的裸倉庫中。此時你還需要進入你的web目錄把更新的代碼文件pull到你的指定目錄,這樣明顯非常的不方便。這也不是我們想要的結果,這時候就是到git的鉤子發輝作用的時候了。git鉤子可以幫你解決你以上提出的問題。

下面開始我們的設置。

進入我們的裸倉庫的hooks文件夾,然後新建一個post-receive文件。

cd hooks/
vim post-receive

在post-receive寫入以下內容:

#!/bin/bash
git --work-tree=/www/carcartalk checkout -f

其中/www/carcartalk爲你實際需要同步的站點目錄。

然後修改post-receive爲可執行文件(其實這就是一個腳本文件)

chmod +x post-receive

post-receive的原理就是,當遠程倉庫發現有用戶執行了push操作,就會執行一個腳本post-receive(鉤子)。其實git還提供了很多其它動作的鉤子,這裏我們就不深入瞭解了。

注意:同時你還需要修改你的web站點目錄的權限,修改所屬用戶與用戶組爲git,否則鉤子的權限可能會不足而導致執行失敗。(你也可以通過添加git用戶到相應的用戶組來解決問題)

chown git:git -R /www    #修改所屬用戶

設置好鉤子後,當你本地再次執行push的時候,你會發現你web目錄的文件也同步的更新了。

到這一步,我們的“Linux搭建GIT服務器並實現hook同步到指定目錄”教程算是已經講解完了。哈哈,聰明的人肯定還記得前面遺留的一個問題,嗯嗯,就是關於公鑰驗證的問題。

內容比較多,我下面就單獨用一個小節來講解。

七、配置公鑰驗證方式

在配置了公鑰驗證之後,當你再次從本地更新代碼到服務器時,將不會再提示輸入密碼。

1)服務器設置

查看你的git用戶目錄下是否存在一個文件.shh,如果沒有的話則自己手動創建。

mkdir .ssh

然後在.ssh文件夾裏面新建一個文件authorized_keys

touch .ssh/authorized_keys

等下會用到這個文件,我們需要分別將其他開發者的公鑰(全選、複製、不能更改!)添加到該文件去,一個開發者的公鑰分一行。

2)查看客戶端的公鑰(linux)

cd ~/.ssh
ls -al  #如果列出了authorized_keys、id_rsa、id_rsa.pub 則證明你擁有公鑰。

如果你的主目錄裏沒有上述的文件,那麼你可以通過運行 ssh-keygen 程序來創建它們。

ssh-keygen

首先 ssh-keygen 會確認密鑰的存儲位置(默認是 .ssh/id_rsa),然後它會要求你輸入兩次密鑰口令。如果你不想在使用密鑰時輸入口令,將其留空即可。

之後你就會在你的根目錄下生成下圖所示的文件:

這裏我們需要的就是id_rsa.pub文件裏面的內容,也就是你的公鑰。裏面內容如下:

把它複製,然後提交給git服務器的管理員進行相關配置。

如果你的客戶端是windows,那麼查看公鑰的方法如下:

3)查看客戶端的公鑰(Windows)

在 Windows 上,該程序包含於Git 軟件包中。打開你的git命令行,輸入

ssh-keygen.exe    #創建公鑰

由於我的本地之前已經創建過密鑰,所以得到如上圖的結果。

然後根據你創建時提示的實際路徑即可找到你的公鑰文件,windows一般都是放在C:\Users\Administrator.ssh中。接下來就和上面一樣,把你的公鑰文件id_rsa.pub提供給git管理員。

4)服務器配置

打開在上面第1)步創建的文件authorized_keys,然後把第2)或第3)步提供給你的公鑰粘貼到該文件。注意!如果有多個開發者需要受權,則你需要把他們的公鑰都拷貝到這個文件,每個公鑰需要單獨佔一行!

5)測試

此時,當你再次向git服務器push的時候,將不會再彈出需要輸入密碼的提示,如上圖。

感謝閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章