首先你需要有一台root权限的服务器, 我接下来的操作将依托centos操作系统操作

创建git裸仓库

上面看到的repo目录中的wx.git实际上是一个裸仓库,我们用下面的命令来生成这样一个仓库。

  cd /www/repo
  git init --bare wx.git

执行上面这些命令后,你就能看见下面说的目录,部署目录是你自己的项目目录

文件结构和目录

我自己的项目结构是这样的,每一个仓库对应一个项目,例如public/wx项目对应repo/wx.git仓
├── public
| └── wx // 这是我们的web代码部署目录
| |── index.php
│ ├── test2.ph
│ ├── test3.php
│ └── test.php
└── repo // 这个是我们的仓库目录
└── wx.git // 这个对应wx项目的仓库
├── branches
├── config
├── description
├── HEAD
├── hooks // post-receive钩子代码写在这里面
├── index
├── info
├── objects
└── refs

进入wx.git,你能看见hooks文件目录,内容如下:

├── applypatch-msg.sample
├── commit-msg.sample
├── post-commit.sample
├── post-receive
├── post-receive.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-rebase.sample
└── update.sample

我们将post-receive.sample复制一份post-receive,并且编写代码如下

# 指定我的代码检出目录DIR=/www/public/wxgit --work-tree=${DIR} clean -fd
# 直接强制检出git --work-tree=${DIR} checkout --force

example
# WORK_TREE='/www/wwwroot/wxgit.kevinfei.com/'
# git --work-tree="${WORK_TREE}" reset --hard

创建git用户

接下来我们需要创建git用户组和用户,用于git服务的操作

用户基本信息:存储在 /etc/passwd 文件中;
用户密码信息:存储在 /etc/shadow 文件中;
用户群组基本信息:存储在 /etc/group 文件中;
用户群组信息信息:存储在 /etc/gshadow 文件中;
用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名。

如果你不清楚这些文件的用途,没关系,我们可以通过命令来执行创建用户操作

#创建 git 用户组
example : [root@localhost ~]# groupadd [选项] 组名
[root@localhost ~]# groupadd git

#创建新 git 用户
example : [root@localhost ~]# useradd [选项] 组名
[root@localhost ~]# useradd git
[root@localhost ~]# passwd git
#为 git 用户设置密码,至此 git 用户才算是创建成功

#删除 git 用户
[root@localhost ~]# userdel -r 用户名
-r 选项表示在删除用户的同时删除用户的家目录。

赋权并创建证书登录

我们给git仓库进行git赋权,用户本地进行拉取和推送代码,并且我们需要先设置web代码部署目录.

[root@localhost ~]# chown -R git:git /www/public/wxgit
[root@localhost ~]# chown -R git:git /www/repo/

需要先在自己的本地创建SSH Key,私钥和公钥

[root@localhost ~]# ssh-keygen -t rsa -C "user@email.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

添加SSH Key

将本地生成的id_rsa.pub内容追加到git服务器git用户的~/.ssh/authorized_keys , 然后对验证文件进行赋权

 [root@localhost ~]# chown 600 /home/git/.ssh/authorized_keys   
 [root@localhost ~]# chown 700 /home/git/.ssh

SSH服务端配置

  [root@localhost ~]# sudo vim /etc/ssh/sshd_config
  RSAAuthentication yes 
  PubkeyAuthentication yes
  AuthorizedKeysFile      /home/git/.ssh/authorized_keys

禁用git用户shell登录

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash
改为:git:x:1001:1001:,,,:/home/git:/usr/local/bin/git-shell

设置本地git用户配置

git config --global user.name "username"
git config --global user.email "user@email.com"

本地拉取

在本地电脑上,我们添加远程仓库

  git init
  git remote add origin git@xxx.xxx.xxx.xxx:/www/repo/wx.git

这个时候我们添加了远程仓库,那么我们来测试下push操作

  touch index.php
  git add .
  git commit -m 'test'
  git push origin master

可能会提示一个—set-upstream,直接执行下就好了。执行完之后我们登陆服务器,会发现文件已经出现在public/wx/index.php。

post-receive的另一种版本

#!/bin/bash
DEPLOY_PATH="/home/wwwroot/demo"

echo "================================"
echo "service begin pull code"

unset  GIT_DIR     #这条命令很重要
cd $DEPLOY_PATH
git reset --hard
git pull /home/git/demo.git
time=`date`

echo "service finished pull code at $time"
echo "================================"

其中DEPLOY_PATH=”/home/wwwroot/demo” 的路径下写你的源码路径。

注意点

如果我们没有配置ssh免密码登陆的话,我们需要在push代码的时候输入密码。
如果我们添加的远程仓库不是root@xxx.xxx.xx.xx,例如是git@xx.xx.xx.xx,那么我们要确保 git用户对wx.git目录下的文件有777权限。
上面的操作过程中的文件路径要注意,别做愣复制的小白伸手党。

新增仓库

需要登陆远程服务器进行初始化repo_name.git仓库。
需要手动创建public/repo_name文件夹,并且修改权限为777。
需要重新编写hooks/post-recieve文件,修改里面的DIR路径为public/repo_name。