(注:我的服務(wù)器是Ubuntu 16.04.3 LTS 64)
一、在服務(wù)器上安裝git
sudo apt-get install git

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

二、添加git用戶
有一些操作系統(tǒng)會在你安裝git時會同時幫你創(chuàng)建一個git用戶,但Ubuntu的需要我們手動來創(chuàng)建。這也非常簡單的,那我們就來手動創(chuàng)建一個git用戶:
sudo adduser git #輸入密碼,然后其它信息默認直接回車就行。

三、在服務(wù)器上創(chuàng)建裸倉庫

你也可以一條命令完成上面的操作:
git --bare init carcartalk.git
裸倉庫里面只保存了一些配置信息和你的版本庫文件等,但是看不到我們所上傳的文件或代碼的,這就是裸倉庫的特點。我們只需要能夠從裸倉庫里clone代碼到你的本地就行。

其實裸倉庫的內(nèi)容也就是我們正常git倉庫里面的隱藏文件夾.git里面的內(nèi)容
四、在本地克隆服務(wù)器上的裸倉庫
我的客戶端是windows,我已經(jīng)安裝好git了。windows上的git安裝非常簡單,上網(wǎng)直接百度一個git的exe文件安裝就行。如果沒有的話,我這里也可以推薦一個git的下載鏈接:https://git-scm.com/downloads,點擊打開,選擇windows版本直接下載安裝即可,和所有的windows軟件安裝一樣,這里我就不特別說明了。
嚴格來說,其實Git并沒有所謂的服務(wù)器端和客戶端,這也是Git和SVN最大的一點不同。不管你在哪里創(chuàng)建了一個git倉庫,原理上它都可以充當(dāng)一個git服務(wù)器,這取決于你的配置。深入了解就涉及到很多git的原理知識了,感趣興的同學(xué)可以自行去學(xué)習(xí),當(dāng)然,我也非常推薦你這樣去做。
好了,我又扯遠了,回到主題
克隆剛剛在服務(wù)器創(chuàng)建的裸倉庫到本地:
git clone git@服務(wù)器ip:/home/git/project/carcartalk.git carcartalk

然后輸入你的git用戶的密碼,你將會看到一個如下的“warning”提示,即說明你已經(jīng)完成了克隆到本地的任務(wù)。
warning: You appear to have cloned an empty repository.
注意:很有可能你會在這個步驟收到一個權(quán)限不足的錯誤,這很有可能是因為git用戶對你的服務(wù)器端的git倉庫目錄權(quán)限不足的原因,這里你只要把倉庫的所屬用戶及用戶組都改為git即可。
chown git:git -R /home/git #正常來說,如果你是在git用戶的主目錄下創(chuàng)建倉庫則不會出現(xiàn)該問題。
這里可能你還有一個疑問,如果我不知道git用戶的密碼呢?這該怎么辦?(因為把git的密碼告訴別人,那么他就可能會登錄上你的服務(wù)器。)
其實有兩種辦法可以解決這個問題,(1)可以登錄你的root用戶,設(shè)置git用戶不可登錄服務(wù)器,這樣你把git密碼透露出去也相對沒那么危險,但我還是推薦下一種方法;(2)通過驗證客戶端秘鑰來實現(xiàn)不需要密碼進行g(shù)it代碼管理(等下我會在文章最后面拿這種方法來講解,這個方法用起來會相對方便很多,非常適合開發(fā)。)
五、測試使用
克隆了遠程倉庫到本地后,你可以先進行一些簡單的測試操作,確保你的git能正常使用,如下:
touch readme.txt
git add readme.txt
git commit -m"first commit"
git push origin master # 在服務(wù)器端沒有配置秘鑰之前,每次push都要輸入密碼
第一次push可能會有一些提示,因為裸版本庫還什么都沒有,你可能需要 git push origin master寫全命令,之后就沒必要了,直接 git push 就可以了。

六、設(shè)置git鉤子
就比如一個web服務(wù)器,當(dāng)我們在本地把開發(fā)好的代碼文件push到服務(wù)器時,只是把更新提交到了你一開始在服務(wù)器創(chuàng)建的裸倉庫中。此時你還需要進入你的web目錄把更新的代碼文件pull到你的指定目錄,這樣明顯非常的不方便。這也不是我們想要的結(jié)果,這時候就是到git的鉤子發(fā)輝作用的時候了。git鉤子可以幫你解決你以上提出的問題。
下面開始我們的設(shè)置。
進入我們的裸倉庫的hooks文件夾,然后新建一個post-receive文件。
cd hooks/
vim post-receive
在post-receive寫入以下內(nèi)容:
#!/bin/bash
git --work-tree=/www/carcartalk checkout -f
其中/www/carcartalk為你實際需要同步的站點目錄。
然后修改post-receive為可執(zhí)行文件(其實這就是一個腳本文件)
chmod +x post-receive

post-receive的原理就是,當(dāng)遠程倉庫發(fā)現(xiàn)有用戶執(zhí)行了push操作,就會執(zhí)行一個腳本post-receive(鉤子)。其實git還提供了很多其它動作的鉤子,這里我們就不深入了解了。
注意:同時你還需要修改你的web站點目錄的權(quán)限,修改所屬用戶與用戶組為git,否則鉤子的權(quán)限可能會不足而導(dǎo)致執(zhí)行失敗。(你也可以通過添加git用戶到相應(yīng)的用戶組來解決問題)
chown git:git -R /www #修改所屬用戶
設(shè)置好鉤子后,當(dāng)你本地再次執(zhí)行push的時候,你會發(fā)現(xiàn)你web目錄的文件也同步的更新了。
到這一步,我們的“Linux搭建GIT服務(wù)器并實現(xiàn)hook同步到指定目錄”教程算是已經(jīng)講解完了。哈哈,聰明的人肯定還記得前面遺留的一個問題,嗯嗯,就是關(guān)于公鑰驗證的問題。
內(nèi)容比較多,我下面就單獨用一個小節(jié)來講解。
七、配置公鑰驗證方式
在配置了公鑰驗證之后,當(dāng)你再次從本地更新代碼到服務(wù)器時,將不會再提示輸入密碼。
1)服務(wù)器設(shè)置
查看你的git用戶目錄下是否存在一個文件.shh,如果沒有的話則自己手動創(chuàng)建。
mkdir .ssh
然后在.ssh文件夾里面新建一個文件authorized_keys
touch .ssh/authorized_keys
等下會用到這個文件,我們需要分別將其他開發(fā)者的公鑰(全選、復(fù)制、不能更改?。┨砑拥皆撐募?,一個開發(fā)者的公鑰分一行。

2)查看客戶端的公鑰(linux)
cd ~/.ssh
ls -al #如果列出了authorized_keys、id_rsa、id_rsa.pub 則證明你擁有公鑰。
如果你的主目錄里沒有上述的文件,那么你可以通過運行 ssh-keygen 程序來創(chuàng)建它們。
ssh-keygen

首先 ssh-keygen 會確認密鑰的存儲位置(默認是 .ssh/id_rsa),然后它會要求你輸入兩次密鑰口令。如果你不想在使用密鑰時輸入口令,將其留空即可。
之后你就會在你的根目錄下生成下圖所示的文件:

這里我們需要的就是id_rsa.pub文件里面的內(nèi)容,也就是你的公鑰。里面內(nèi)容如下:

把它復(fù)制,然后提交給git服務(wù)器的管理員進行相關(guān)配置。
如果你的客戶端是windows,那么查看公鑰的方法如下:
3)查看客戶端的公鑰(Windows)
在 Windows 上,該程序包含于Git 軟件包中。打開你的git命令行,輸入
ssh-keygen.exe #創(chuàng)建公鑰

由于我的本地之前已經(jīng)創(chuàng)建過密鑰,所以得到如上圖的結(jié)果。
然后根據(jù)你創(chuàng)建時提示的實際路徑即可找到你的公鑰文件,windows一般都是放在C:\Users\Administrator.ssh中。接下來就和上面一樣,把你的公鑰文件id_rsa.pub提供給git管理員。
4)服務(wù)器配置
打開在上面第1)步創(chuàng)建的文件authorized_keys,然后把第2)或第3)步提供給你的公鑰粘貼到該文件。注意!如果有多個開發(fā)者需要受權(quán),則你需要把他們的公鑰都拷貝到這個文件,每個公鑰需要單獨占一行!
5)測試

此時,當(dāng)你再次向git服務(wù)器push的時候,將不會再彈出需要輸入密碼的提示,如上圖。
感謝閱讀!