美文网首页Git使用RedmineGit
centOS7 搭建自己的git服务器

centOS7 搭建自己的git服务器

作者: 云中漫步2125 | 来源:发表于2019-01-28 03:38 被阅读3次

很多时候考虑到企业项目可维护性,大家还是希望拥有自己的代码版本库,github、gitee都是不错的选择,但是完全依赖于这些平台,对代码安全性总有疑虑,也不利于自己团队在版本管理上的成长。gitee企业版今天也出了点小问题,登录后总提示500错误。于是考虑了落实自建git服务器的计划。

Git服务器搭建过程

参考文章:

Aaron的个人技术博客 CentOS7搭建git 服务器
正如Aaron所说,这个方案适合于自己开发,自己使用,遇到团队作战时,管理起来就不那么方便灵活了。但是熟悉Git服务器搭建过程,是继续团战的基础。本文会根据Aaron和Git中文网的资料,进行团战搭建的介绍。

本文是实践总结,主要记录按照上述文章实际搭建中遇到的问题。

  1. yum 安装 git
# yum install git
  • 备注:网上有很多从源码安装的例子,我实操下来感觉不是很有必要,yum库安装速度快,还可以避免一些目录和权限的问题,所以推荐直接yum 安装 git。
  1. 确认git版本
# git --version
git version 1.8.3.1
  • 备注:CentOS7 自带了1.8.3.1
  1. 添加git用户组和git用户
# groupadd git
# adduser git -g git
# passwd
  • 备注1:原文只使用 adduser git,但实际上他也是创建了git组的,我还是老老实实用了上面这串命令
  • 备注2:passwd执行后,要求输入密码,就是给git账号设置密码
  1. 创建git工作目录
# mkdir -p /home/git/.ssh
  • 备注:加上-p支持 mkdir创建多级目录
  1. 创建用户公钥保存的文件
# touch /home/git/.ssh/authorized_keys
# vi /home/git/.ssh/authorized_keys
  • 备注1:添加用户公钥时,要一行一个。
  • 备注2:windows下获取ssh公钥的方法,可在git客户端的git bash下执行如下的命令
# ssh-keygen
  • 备注3:上面的命令可以一路yes,一路默认,不输入密码。最终在windows的用户目录下的.ssh目录下,可以找到id_rsa.pub,把内容copy出来,一行一个用户的粘贴到上面的文件中即可。
  1. 创建测试代码库
# cd /home
# git init --bare test.git
Initialized empty Git repository in /home/test.git/
# chown -R git:git test.git
# ll
total 0
drwxr-xr-x  7 git     git     119 Jan 27 22:44 test.git
  1. 设置git用户只能登录执行git-shell,且每次都要登录
# vi /etc/passwd

找到git:x开头的那行改为

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
  • 备注:上面这里的/usr/bin/git-shell是你的git-shell所在的目录,如果用yum安装git,应该就是在这个目录,如需要确认,可执行下面的命令查找
# find / | grep git-shell
find: ‘/proc/1831’: No such file or directory
/usr/bin/git-shell
/usr/share/doc/git-1.8.3.1/contrib/git-shell-commands
  1. 本地电脑远程克隆test.git测试
    这里给出两个方案:
    方案1: 如果你的ssh端口号没有变动,可能下面的命令已经可以执行了,我自己的服务器是改了ssh端口号的,所以我不知道下面的命令是否可以正常执行
# git clone git@服务器IP地址:/home/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.

方案2: 如果你的ssh端口号变了,要按照下面的命令来执行,才能成功。这也是我一开始没搞定的原因,特此记录。

# git clone ssh://git@服务器IP地址:ssh端口/home/test.git
Cloning into 'test'...
The authenticity of host '[服务器IP]:ssh端口 ([服务器IP]:ssh端口)' can't be established.
ECDSA key fingerprint is SHA256:************************************************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[服务器IP]:ssh端口' (ECDSA) to the list of known hosts.
warning: You appear to have cloned an empty repository.
  • 备注:至此,git服务器搭建完成了,我们还要把自己的git库传到服务器上去,这个问题等一会儿会讲。

增加Gitosis管理,方便团队化作战

安装Gitosis

恭喜你,经过刚才的实践,你已经掌握了Git服务器的搭建方法。上面的方案有三个问题:

  1. git clone 的远程git路径,是全路径,相对来说记忆比较困难。
  2. 用户的添加是通过修改/home/git/.ssh/authorized_keys,人员增加后维护起来就比较麻烦。
  3. 这个问题应该比较关键。 git仓库无法进行多项目的权限控制,一旦增加人员,就自动获取了全部项目的代码访问权限。

为了解决上述问题,Gitosis应运而生了。

Gitosis 主要解决两个问题:

  1. 相对路径问题
  2. 项目的分组管理和人员授权访问问题。

还是先进行安装实践,我会结合实际情况,介绍解决遇到的一些问题。

  1. 安装python依赖
    Gitosis 的工作依赖于某些 Python 工具,所以首先要安装 Python 的 setuptools 包
# yum install python-setuptools
  1. 获取 Gitosis 源码,并安装
# git clone https://github.com/tv42/gitosis.git
# cd gitosis
# python setup.py install
  • 备注: 这会安装几个供 Gitosis 使用的工具。默认 Gitosis 会把 /home/git 作为存储所有 Git 仓库的根目录。
  1. 修改git账号的权限
# vi /etc/passwd

找到 git:x: 开头那行,改回

git:x:1001:1002::/home/git:/bin/bash
  • 备注:上一段,我们直接用Git服务器时,为了避免git账户的非法登录,我们改成每次必须登录,命令行为git命令行的方式。但是由于gitosis需要的系统命令更多,所以还是必须要改回bin/bash的模式
  1. 清掉/home/git/.ssh/authorized_keys
# rm -rf /home/git/.ssh/authorized_keys
# touch /home/git/.ssh/authorized_keys
# chown -R git:git /home/git/
  • 备注:因为Gitosis需要接管Git服务器的授权访问控制,所以authorized_keys将由Gitosis来维护,为了避免控制面的冲突,我们需要清掉authorized_keys,重新通过Gitosis来创建用户。不用担心之前的访问权限丢失,下一步将之前的账号加回来之后,权限自然恢复。
  1. 初始化Gitosis
    准备工作:用ftp或其他将你的id_rsa.pub,ssh公钥文件上传的git服务器,假设位置在/tmp/id_rsa.pub。
    然后还是在刚才的Gitosis源码目录下
# su - git
# gitosis-init < /tmp/id_rsa.pub
# cd ~
# ll
total 0
drwxr-xr-x 2 git git  27 Jan 28 01:28 gitosis
drwxr-xr-x 8 git git 124 Jan 28 01:37 repositories
  • 备注:这里我执行时,只遇到过权限导致的问题,解决方案就是 回到 root账号下,执行 chown -R git:git /home/git/
  1. 总结一下,上面干了什么

主要工作是:

  1. 利用Python安装好了Gitosis的环境
  2. 利用 /tmp/id_rsa.pub 初始化了一个管理Gitosis的账户

一切的真相在你打开 /home/git/.ssh/authorized_keys 后就知晓了。

# vi /home/git/.ssh/authorized_keys

你会看到刚才被我们清掉的authorized_keys文件里,被导入了id_rsa.pub的内容,但是和我们自己的写入的时候有所差异

### autogenerated by gitosis, DO NOT EDIT
command="gitosis-serve 用户名",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

管理Gitosis

刚才我们安装Gitosis后,发现/home/git下多了两个目录

# ll
total 0
drwxr-xr-x 2 git git  27 Jan 28 01:28 gitosis
drwxr-xr-x 8 git git 124 Jan 28 01:37 repositories

重要的目录只有一个repositories,这里面存储以后我们所有的项目的git仓库文件

# cd /home/git/repositories
# ll
total 0
drwxr-x--- 7 git git 139 Jan 28 01:28 gitosis-admin.git

目前这个目录下只有一个文件夹gitosis-admin.git,这就是Gitosis自带的管理工具了,接下来我们需要把这个工具clone到本地,来管理一下Gitosis

  1. clone Gitosis-admin
    在你刚才获得id_rsa.pub的那台电脑,一般就是你的工作机吧。
# git clone git@服务器IP:gitosis-admin.git

如果是ssh端口号改变的情况

# git clone ssh://git@服务器IP:ssh端口号/gitosis-admin.git
  • 备注1:注意到吗?gitosis-admin.git的并没有使用全路径来获取。如果你执行上面的命令成功了,说明你已经可以使用相对路径来访问git仓库了
  • 备注2:如果你遇到错误:fatal: '/gitosis-admin.git' does not appear to be a git repository ,也就是相对路径不生效。原因只是因为你可能没有清空/home/git/.ssh/authorized_keys,该文件里有不是Gitosis标准的公钥配置存在,导致了Gitosis出错了。方法就是删掉authorized_keys,走刚才的安装Gitosis时的第5步,重新初始化一下他,一般问题就解决了。
  1. clone成功,怎么通过gitosis-admin就能管理Gitosis和Git呢?

原理:gitosis-admin 通过gitosis.conf来配置项目组、用户组和权限关系,通过keydir目录保存用户的公钥,通过git提交实现对Gitosis服务配置的更新维护。

看一下gitosis-admin的目录

# dir
2019/01/28  01:15    <DIR>          .
2019/01/28  01:15    <DIR>          ..
2019/01/28  01:22               365 gitosis.conf
2019/01/28  01:21    <DIR>          keydir
  1. 编辑gitosis.conf,实现项目和用户管理
[gitosis]

// gitosis-admin的可访问用户设置
[group gitosis-admin]
writable = gitosis-admin  // 可读写的工程项目
members = Administrator  // 这里名字和keydir目录下的pub文件名字要保持一致,也就是说keydir目录下要有一个名为 Administrator.pub 的文件

// 组可以只有用户而没有工程项目,这种可以方便的对项目的访问权限进行用户群组管理
[group developer]
members = tom Jams KK // 开发组,完整的读写权限

[group tester]
member = miya lucy lily //测试组,只需要只读权限

// 工程项目实例
[group test1]
writable = test1 // 可读写的工程项目
member = @developer // 三个开发组成员将同时具有该项目的读写权限。

[group test1_readonly]
readonly = test1 // 只读权限
member = @tester Jack // 三个测试组成员和Jack可以克隆和获取更新,但 Gitosis 不会允许他向项目推送任何内容。
  1. 小结
    通过上面的工作,我们搞定了Gitosis管理Git服务器。Gitosis利用Git本身非常巧妙的实现了控制Git服务器的目的。

如何将已有git代码迁移到自己的git服务器

这部分估计很多人都有经验了,但是我还是记录一下,让这个经验总结有头有尾,方便大家查看。

  1. 将本地代码的变更及时缓存起来
# git add .
# git commit -m "init own git server"
  1. 在git服务器上创建空白仓库
# cd /home/git/repositories
# mkdir 仓库名.git
# cd 仓库名.git
# git init --bare
  1. 利用Gitosis赋予仓库访问权限
# vi gitosis-admin/gitosis.conf

将内容编辑为

[gitosis]

[group gitosis-admin]
members = administrator
writable = gitosis-admin

[group common]
members = Jack

[group 仓库名]
members = @common
writable = 仓库名

提交变更

# cd gitosis-admin
# git add .
# git commit -m "添加仓库"
# git push
  • 备注:到这里,仓库名.git就能够用Jack的账户进行远程更新和上传了。
  1. 修改本地代码的git remote,将代码上传到git服务器
# git remote remove origin
# git remote add origin ssh://git@服务器IP:ssh端口/仓库名.git
# git push -u origin master
# git pull
# git branch --set-upstream-to=origin/master master
# git pull

这里,Jack的本地代码和git服务器的代码就关联起来了。

相关文章

网友评论

    本文标题:centOS7 搭建自己的git服务器

    本文链接:https://www.haomeiwen.com/subject/zdfojqtx.html