自动化部署:
gitlab在客户端push上传代码后,服务器自动更新代码到项目目录中
1、切换到服务器上项目的gitlab目录,创建custom_hooks自定义钩子目录
# 切换到项目gitlab目录
[root@iZwz90o2a8lpw2xgmh9bqpZ ~]# cd /var/opt/gitlab/git-data/repositories/@hashed/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git/
[root@iZwz90o2a8lpw2xgmh9bqpZ 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# ls -la
total 12
drwxr-s--- 6 git git 103 Mar 4 10:23 .
drwxr-s--- 4 git git 163 Mar 4 10:23 ..
-rw-r--r-- 1 git git 105 Mar 4 10:23 config
-rw-r--r-- 1 git git 73 Mar 4 10:23 description
-rw-r--r-- 1 git git 23 Mar 4 10:23 HEAD
drwxr-sr-x 2 git git 332 Mar 4 10:23 hooks
drwxr-sr-x 2 git git 21 Mar 4 10:23 info
drwxr-sr-x 4 git git 30 Mar 4 10:23 objects
drwxr-sr-x 4 git git 31 Mar 4 10:23 refs
# 创建目录 并 赋予权限
[root@iZwz90o2a8lpw2xgmh9bqpZ 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# mkdir custom_hooks
[root@iZwz90o2a8lpw2xgmh9bqpZ 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# chmod 777 custom_hooks
[root@iZwz90o2a8lpw2xgmh9bqpZ 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# ls -la
total 12
drwxr-s--- 7 git git 123 Mar 4 10:38 .
drwxr-s--- 4 git git 163 Mar 4 10:23 ..
-rw-r--r-- 1 git git 105 Mar 4 10:23 config
drwxrwsrwx 2 root git 6 Mar 4 10:38 custom_hooks
-rw-r--r-- 1 git git 73 Mar 4 10:23 description
-rw-r--r-- 1 git git 23 Mar 4 10:23 HEAD
drwxr-sr-x 2 git git 332 Mar 4 10:23 hooks
drwxr-sr-x 2 git git 21 Mar 4 10:23 info
drwxr-sr-x 4 git git 30 Mar 4 10:23 objects
drwxr-sr-x 4 git git 31 Mar 4 10:23 refs
2、切换到custom_hooks目录里,创建 post-receive 文件,添加以下内容并保存退出,并赋予权限
[root@iZwz90o2a8lpw2xgmh9bqpZ 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# cd custom_hooks/
[root@iZwz90o2a8lpw2xgmh9bqpZ 2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3.git]# vi post-receive
#!/bin/sh
unset GIT_DIR
cd 你项目的根目录绝对路径 && git reset --hard && git pull origin master
[root@iZwz90o2a8lpw2xgmh9bqpZ custom_hooks]# chmod 777 post-receive
[root@iZwz90o2a8lpw2xgmh9bqpZ custom_hooks]# ls -la
total 4
drwxrwsrwx 2 root git 26 Mar 4 10:50 .
drwxr-s--- 7 git git 123 Mar 4 10:50 ..
-rwxrwxrwx 1 root git 116 Mar 4 10:50 post-receive
3、在服务器上,把项目clone下来,并编辑 .git/config 配置
切换到 /data ,然后 clone 项目
[root@iZwz90o2a8lpw2xgmh9bqpZ custom_hooks]# cd /data
[root@iZwz90o2a8lpw2xgmh9bqpZ data]# git clone 项目的gitlab地址
切换到 项目根目录,编辑 .git/config 配置
[root@iZwz90o2a8lpw2xgmh9bqpZ data]# cd 项目根目录/
[root@iZwz90o2a8lpw2xgmh9bqpZ 项目根目录]# vi .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = http://gitlab用户名:gitlab密码@项目gitlab地址
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
保存并退出即可
4、在gitlab客户端 push上传后,即可在服务器上 你项目的根目录绝对路径 看到上传的文件
错误处理
1、如果出现以下错误 warning:Pulling without specifying how to reconcile divergent branches is
discouraged
-------------
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.
From gitlab项目地址
* branch master -> FETCH_HEAD
Already up to date.
则修改post-receive 文件为
#!/bin/sh
unset GIT_DIR
cd 你项目的根目录绝对路径 && git reset --hard && git pull origin master --ff-only
2、如果出现以下错误fatal: refusing to merge unrelated histories
HEAD is now at ffca2d1
From gitlab项目地址
* branch master -> FETCH_HEAD
fatal: refusing to merge unrelated histories
则修改post-receive 文件为
#!/bin/sh
unset GIT_DIR
cd 你项目的根目录绝对路径 && git reset --hard && git pull origin master --allow-unrelated-histories
3、如果git push时出现以下错误 remote: error: update_ref failed for ref 'HEAD': cannot update the ref 'HEAD': unable to append to '.git/logs/HEAD': Permission denied
git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 12 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 435 bytes | 435.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0), pack-reused 0
remote: --------------
remote: error: update_ref failed for ref 'HEAD': cannot update the ref 'HEAD': unable to append to '.git/logs/HEAD': Permission denied
则在客户端运行命令:chown -R "${USER:-$(id -un)}" . 然后重新提交即可
#运行命令
chown -R "${USER:-$(id -un)}" .
#重新提交
git add .
git commit -m "Changed"
git push origin master
#即可
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 12 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 438 bytes | 438.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0), pack-reused 0
remote: --------------
remote: Updating files: 100% (10190/10190), done.
remote: HEAD is now at 1f123398 Changed
remote: * branch master -> FETCH_HEAD
remote: 1f123398..35963c22 master -> origin/master
remote: Updating 1f123398..35963c22
remote: Fast-forward
remote: 4 files changed, 10 insertions(+), 10 deletions(-)
54314a9e..35963c22 master -> master
4、如果出现error: The following untracked working tree files would be overwritten by merge
则修改post-receive 文件为
#!/bin/sh
unset GIT_DIR
cd 你项目的根目录绝对路径 && git reset --hard && git clean -d -fx && git pull origin master --allow-unrelated-histories