Git使用RedmineGit

centOS7 搭建自己的git服务器

2019-01-28  本文已影响3人  云中漫步2125

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

Git服务器搭建过程

参考文章:

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

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

  1. yum 安装 git
# yum install git
  1. 确认git版本
# git --version
git version 1.8.3.1
  1. 添加git用户组和git用户
# groupadd git
# adduser git -g git
# passwd
  1. 创建git工作目录
# mkdir -p /home/git/.ssh
  1. 创建用户公钥保存的文件
# touch /home/git/.ssh/authorized_keys
# vi /home/git/.ssh/authorized_keys
# ssh-keygen
  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
# 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.

增加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
  1. 修改git账号的权限
# vi /etc/passwd

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

git:x:1001:1002::/home/git:/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/
  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
  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. 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
  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服务器的代码就关联起来了。

上一篇下一篇

猜你喜欢

热点阅读