之前在部署WebHook的时候就有一个想法: 有没有必要通过git提交到第三方, 然后由第三方的钩子触发事件发送请求给服务器, 让服务器pull代码?
这里写下我的思考和实际操作, 以及操作里面的坑。( ╯□╰ )其实也不算是坑,只是脑筋没转过弯来。。
零、写在前面
客观或主观来说,由于架构还不够稳定完善,或者想法太多想要一一实践什么的,反正服务器上的代码要有一定频次的修改。
对于这种情况,频繁使用FTP上传是不现实的,因为修改的只是部分,但我也不能精确确认需要上传修改的哪些文件,那么为了保证功能,每次上传肯定有未被修改的多的冗余。
还有一种办法, 就是使用文件同步,这里写一下关键词 Rsync(remote synchronize)
。因为有其它解决方案,不太想新增功能,先mark一下,有需要再用。
另一种方法,就是使用SVN或Git。 将Github或码云等平台作为中转是一个不错的选择,而且这些网站本身自身也有静态页面托管服务,可以做一个备份。 如果不想公开源码,也可以选择Coding.net 等其它平台。有时间还是想用SpringBoot自己将博客从零搭建一下试试。
话不多说,如果认为不保险,仓库其实是可以搭建在自家服务器上的。接下来就讲一下整个过程。
一、几个概念
-
工作目录: 就是你可以使用git操作的命令,比如git checkout啦,暂时可以理解为当前目录下有.git文件夹的目录.
-
暂存区域: 所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件(index),不过标准说法还是叫暂存区域.
-
本地仓库: 就是把暂存区域里面的文件提交到git能够管理的和追踪的仓库里面.
二、服务器建立仓库
git --bare init
建立裸仓:[root@gitserver ~]# mkdir /git =>在根目录下新建一个git目录 [root@gitserver ~]# cd /git => 进入刚才新建的目录 [root@gitserver git]# ls -a => 里面空空如也,没有任何隐藏文件 [root@gitserver git]# git --bare init =>初始化一个裸仓库 Initialized empty Git repository in /git/ [root@gitserver git]# ls -a =>里面多了一些管理仓库的配置文件 . .. branches config description HEAD hooks info objects refs
git init
建立初始化建库:[root@gitserver ~]# cd ~ [root@gitserver ~]# mkdir /git_2 [root@gitserver ~]# cd /git_2 [root@gitserver git2]# git init
-
初始化仓库有2种方式,
git --bare init
和git init
区别有以下2点1, 用git init 初始化里面,git目录下面只有一个.git文件夹,用git –bare init里面的都是些配置文件
2, 用”git init”初始化的版本库用户也可以在该目录下执行所有git方面的操作,但是在当前用户和push用户正在同一分支上的时候,容易冲突。 而”git –bare init”因为不允许实现git操作。
三、本地克隆仓库
举个例子,其中 user为用户名,xx.xx.xx.xx为服务器ip,/usr/workspace/codebase/是git仓库的所在目录
git clone [email protected]:/usr/workspace/codebase/
四、遇见的问题
- git init - 首次push报错:
remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. To ... ! [remote rejected] master -> master (branch is currently checked out) error: failed to push some refs to
需要配置一下git的接收配置,在服务器端init的目录下执行如下命令即可正确提交:
git config receive.denyCurrentBranch ignore`
- git init - 客户端提交后,服务器代码没有更新。但多个客户端测试下来push、pull等功能均正常:
这就是我踩的坑,脑子转不过弯~- 客户端push的分支,如果和服务器当前的分支不是同一个,显然服务器‘显示’的代码理所当然不会更新。
- 客户端push的分支,如果和服务器当前的分支是同一个,因为有服务器本身在修改代码的可能性,git在设计的时候考虑到这一点,显然要等用户来执行‘将push上来的内容更新到当前分支’这一操作。
- 如果同一分支,必须得使用
git reset --hard
才能看到push后的内容。这也是git init很容易会导致冲突的原因。
- git –bare init - 客户端提交后,服务器没有看到相应的代码。 仓库只是仓库,建议在服务器另开git clone仓库pull代码。