NiceLeeのBlog 用爱发电 bilibili~

踩坑记录 - 在服务器上搭建Git仓库

2018-11-13
nIceLee

阅读:


之前在部署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 initgit 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 user@xx.xx.xx.xx:/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代码。

内容
隐藏