三月 19, 2019 in 技术

如何使用Git管理项目代码?Git服务器搭建和自动部署教程

安装 Git

查看 Git 版本。如果存在,则不需要安装。

[root@vultr ~]# git --version
git version 1.8.3.1

如果不存在,则安装

yum install -y git
创建 git 用户

查看用户。如果存在,则不需要添加。

[root@vultr ~]# id git
id: git: no such user

如果不存在,则添加用户并设置密码

[root@vultr ~]# useradd git
[root@vultr ~]# passwd git
Changing password for user git.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
创建git仓库
[root@vultr ~]# cd /home
[root@vultr home]# mkdir -p data/git
[root@vultr home]# cd data/git
[root@vultr git]# git init --bare project_name.git
Initialized empty Git repository in /home/data/git/project_name.git/

执行以上命令,会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。

创建SSH公钥和私钥

如果你没有SSH公钥和私钥,可以通过下面的命令来生成,有则跳过。

ssh-keygen -t rsa -C "your@email.com"

注意看生成的路径,id_rsa 是私钥,id_rsa.pub 是公钥,你要用到的是公钥。

服务器端 Git 开启 RSA 认证

开启RSA认证后,则不需要每次链接输入密码。

进入 /etc/ssh 目录,编辑 sshd_config

[root@vultr git]# nano /etc/ssh/sshd_config

打开以下三个配置的注释,没有则添加。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

重启SSHD服务

systemctl restart sshd.service

由 AuthorizedKeysFile 得知公钥的存放路径是 .ssh/authorized_keys,实际上是 $Home/.ssh/authorized_keys,由于管理 Git 服务的用户是 git,所以实际存放公钥的路径是 /home/git/.ssh/authorized_keys

在 /home/git/ 下创建.ssh目录和文件

[root@vultr git]# cd /home/git/
[root@vultr git]# mkdir .ssh

将客户端公钥id_rsa.pub粘贴到服务器端authorized_keys文件里

[root@vultr git]# nano .ssh/authorized_keys

你的公钥,大概是这个样子的。

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq0G+w+lVTdasv6eo19tocO2Y6JK/hVo2SopeZak7Om/zkkngj4n+0mq8iGGxTG76tMi1nOpOJLbYiiLU8voFQknosZ5Qhj+2QglHo9rjqAxHbuErh1n23yzT0VQ== your@email.com

然后把 .ssh 文件夹的 owner 修改为 git

[root@vultr git]# chown -R git:git .ssh
ssh权限配置

修改 .ssh 目录的权限为 700

修改 .ssh/authorized_keys 文件的权限为 644

需要设置,否则公钥认证会提示 (Permission denied)

[root@vultr git]# chmod 700 .ssh
[root@vultr git]# chmod 644 .ssh/authorized_keys
禁止 git 用户 ssh 登录服务器

安全考虑,我们不允许在服务器端创建的 git 用户 ssh 登录服务器。

nano /etc/passwd

找到

git:x:1002:1002::/home/git:/bin/bash

修改为

git:x:1002:1002::/home/git:/bin/git-shell

现在 git 用户可以正常通过 ssh 使用 git,但无法通过 ssh 登录系统。因为我们为git用户指定的git-shell每次一登录就自动退出。

配置自动部署hooks

进入服务器,创建自动部署脚本文件,修改默认的sample即可

[root@vultr git]# cd /home/data/git/yuancheng.git/hooks/

如果有sample,则复制

cp post-receive.sample post-receive

如果没有sample文件,则自己创建一个

[root@vultr hooks]# nano post-receive

将下面的内容写入post-receive

#!/bin/sh
unset GIT_DIR
WEB_PATH=/www/wwwroot/yuancheng.work/wp-content/themes/yuancheng
GIT_PATH=/home/data/git/yuancheng.git


echo "******************************"
echo "Start deploy..."
cd $WEB_PATH
sudo git pull --force $GIT_PATH master
sudo chown -R www:www $WEB_PATH
echo "******************************"


# add your other shell command her

把脚本文件设置为可执行:

[root@vultr hooks]# chmod +x post-receive

修改整个git仓库为git用户

chown -R git:git /home/data/git/yuancheng.git

设置/etc/sudoers

nano /etc/sudoers
git ALL=(ALL) NOPASSWD: ALL
# 如果有Defaults    requiretty,注释掉。

把git加入了www用户组中

usermod -a -G www git
开始使用Git

将远程仓库添加到本地已存在的git项目,我在这里将远程仓库命名为stage,用于测试。

git remote add stage ssh://git@167.179.74.59:7000/home/data/git/yuancheng.git

设置–set-upstream,下次就可以不指定分支直接push

# 语法:git push --set-upstream 远程repo 本地分支
git push --set-upstream stage master

如果是新项目,则从 Linux Git 服务器上 clone 项目:

$ git clone git@167.179.74.59:/home/data/git/project_name.git

如果SSH用的不是默认的22端口,则需要使用以下的命令(假设SSH端口号是7000):

D:\htdocs\test>git clone ssh://git@167.179.74.59:7000/home/data/git/project_name.git
再次搭建

如果是二次搭建,上面的大部门步骤都不用操作了。

cd /home/data/git/
git init --bare arvinxiang.git
cp /home/data/git/yuancheng.git/hooks/post-receive /home/data/git/arvinxiang.git/hooks/post-receive
cd arvinxiang.git/hooks/
nano post-receive
chmod +x post-receive
chown -R git:git /home/data/git/arvinxiang.git/

将WEB_PATH目录加入git

cd /www/wwwroot/arvinxiang.com/wp-content/themes/svbtle/
git init
git remote add origin /home/data/git/arvinxiang.git
git add . -A
git commit -m "base commit"
git pull origin master --force

强制拉取覆盖本地

git fetch --all && git reset --hard origin/master && git pull origin master --force
参考文章

http://www.moqifei.com/archives/1471

https://www.cnblogs.com/dee0912/p/5815267.html

https://blog.csdn.net/xys_little/article/details/82313027

https://blog.csdn.net/guyan0319/article/details/79111600

https://segmentfault.com/a/1190000010185734

https://blog.csdn.net/Richard_Jason/article/details/53188200

https://segmentfault.com/q/1010000010942213

https://blog.csdn.net/jin970505/article/details/79068429

https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks

https://blog.csdn.net/qq_39940866/article/details/82699378

https://www.cnblogs.com/kenshinobiy/p/4539252.html

 

 

Now read this

如何在Grunt任务中使用Babel? grunt-babel使用教程

如果你使用ES6语法来写JavaScript,babel转换器是必须的一个工具。 Continue →