今天試了下在linux服務器上搭建Git服務器,而且編寫一個簡單的自動部署腳本。html
主要參考 廖雪峯-GIT教程-搭建Git服務器linux
如今開始吧!git
建立一個git用戶,用來運行git服務web
adduser git
建立證書登陸shell
收集全部須要登陸的用戶的公鑰,就是他們本身的id_rsa.pub文件,把全部公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。bash
初始化Git倉庫服務器
先選定一個目錄做爲Git倉庫,假定是/home/git/sample.git,在/home/git目錄下輸入命令:ssh
git init --bare sample.git
Git就會建立一個裸倉庫,裸倉庫沒有工做區,由於服務器上的Git倉庫純粹是爲了共享,因此不讓用戶直接登陸到服務器上去改工做區,而且服務器上的Git倉庫一般都以.git結尾。而後,把owner改成gitpost
chown -R git:git sample.git
禁用git用戶shell登陸spa
經過編輯/etc/passwd文件完成,找到你的git用戶的一行,例如:
git:x:1001:1001:,,,:/home/git:/bin/bash
把/bin/bash改成/usr/bin/git-shell,例如:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git用戶能夠正常經過ssh使用git,但沒法登陸shell,由於咱們爲git用戶指定的git-shell每次一登陸就自動退出。
克隆遠程倉庫
git clone git@server:sample.git
server是你的服務器域名或ip地址
若是git倉庫和web目錄在同一臺服務器主機上:
git clone /home/git/sample.git
若是不是在git用戶的家目錄中建立的,好比/srv/gits/sample.git:
git clone git@server:/srv/gits/sample.git
若是clone成功,那麼你的git服務器就搭建成功了。
接下來:
自動同步鉤子腳本
由於我是web目錄和git是同一臺服務器
編輯 /home/git/sample.git/hooks/post-receive, post-receive就是在git服務器收到代碼推送後(push完成以後)執行的腳本。
#!/bin/sh while read oldrev newrev refname do branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ "master" == "$branch" ]; then # Do something echo "post-receive in branch master" >> /tmp/git-sample.log unset GIT_DIR wwwPath=/var/www/html/sample cd $wwwPath && /usr/bin/git pull origin master exit 0 fi done
從腳本內容能夠看出,咱們在判斷當前push的分支是master時執行git pull origin master操做。
給執行權限:
chown -R git:git /home/git/sample.git/hooks/post-receive chmod +x /home/git/sample.git/hooks/post-receive
由於是git倉庫和web目錄在同一臺服務器主機上,這裏clone使用的是:
git clone /home/git/sample.git
由於同步腳本的執行用戶是git,因此要保證項目目錄要賦予git寫權限。容易出問題的也是權限問題。
好了,試試吧~
原文鏈接:
更多分享知識點,請掃碼關注: