搭建企业私有 GIT 服务
一、GIT 服务器搭建方式
上一篇文章说过 GIT 是一个分布式版本管理系统,既然是分布式那么必然涉及远程通信,那么 GIT 是采用什么协议进行远程通信的呢?
GIT 支持的四种通信协议:
Local(本地协议)
ssh
HTTP(Dumb,Smart)
git
Local(本地协议)
基于本地文件系统或共享(NFS)文件系统进行访问,也就是在团队里的一台电脑上建立 GIT 仓库,开启共享权限,团队成员通过访问该电脑操作 GIT 仓库
优点:简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事
缺点:这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度很慢
适用场景:小团队,小项目临时搭建版本服务
演示本地协议使用方式:
在本地 F 盘创建 git 裸项目
git --bare init demo.git
从本地 E 盘克隆本地项目
git clone /f/demo.git
还可以基于 file 协议克隆本地项目
git clone file:///f/demo.git
如果在开头明确指定 file://,那么 GIT 的行为会略有不同。如果仅是指定路径,GIT 会尝试使用硬链接或直接复制所需要的文件。如果指定 file://,GIT 会触发平时用于网络传输资料的过程,传输过来的是打包好的文件,更节约硬盘空间
ssh
GIT 支持利用 ssh 协议进行通信,这是绝大部分 linux 系统都支持的,所以利用该协议架构 GIT 版本服务是非常方便的
优点:首先 SSH 架构相对简单、其次通过 SSH 访问是安全的、另外 SSH 协议很高效,在传输前也会尽量压缩数据
缺点:权限体系不灵活,必须提供操作系统的账户密码,哪怕是只需要读取版本
演示基于 ssh 协议
我们必须先把 git 服务安装到 linux 系统上,然后才能使用 ssh 协议跟 git 服务进行通信
linux 安装 git 服务
安装依赖环境
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
下载并解压源码
$ wget https://github.com/git/git/archive/v2.3.0.zip
$ unzip v2.3.0.zip
$ cd git-2.3.0
编译安装(如果没有权限就加上 sudo)
make prefix=/usr/local/git all
make prefix=/usr/local/git install
添加环境变量
vim /etc/profile
export PATH=/usr/local/git/bin:$PATH
source /etc/profile
检验是否成功安装
git --version
进入/data/git-repository(没有的话创建)
创建一个裸项目
git --bare init demo.git
本地基于远程克隆项目
git clone root@ip:/data/git-repository/demo.git
cd demo
添加文件
echo "test demo" >>README.MF
本地添加,提交并推送到远程
git add .
git commit -m "first commit"
git push
可能出现的错误:
git-upload-pack: command not found
原因是 ssh 协议下只能访问/usr/bin 下的目录,解决办法如下
ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack
ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack
HTTP(Dumb、Smart)
GIT http 协议的实现是依赖 WEB 容器(Apache,Nginx)及 cgi 组件进行通信交互,并利用 WEB 容器本身权限体系进行授权验证。在 GIT1.6.6 前只支持 http Dumb(哑)协议,该协议只能下载不能提交,通常会配合 ssh 协议一起使用,ssh 协议分配提交账号,http Dumb 提供只读账号。1.6.6 之后 GIT 提供了 git-http-backend 的 CGI 用于实现接收远程推送等功能。
优点:解决了 local 和 ssh 权限验证单一的问题、可基于 http url 提供匿名服务,从而可以放到公网上去。而 local 与 ssh 很难做到这一点,比如实现一个类似 GitHub 这样的网站。
缺点:架构复杂一些,需要部署 WEB 服务器,和 https 证书之类的配置
场景:大型团队,需要对权限精准控制,需要把服务部署到公网上去
演示 http Dumb 配置与使用
创建服务端版本仓库
cd /data/git-repository
git --bare init demo.git
cd demo.git/hooks/mv
// 版本更新钩子,当有版本提交的时候会执行更新
post-update.sample post-update
./post-update
nginx 静态访问配置
server {
listen 80;
server_name git.demo.com;
location / {
root /data/git-repository;
}
}
#重命名钩子
mv hooks/post-update.sample hooks/post-update
本地克隆远程服务
git clone http://git.demo.com/demo.git
注:http Smart 协议是基于 CGI 配合 GIT git-http-backend 脚本进行使用,配置较复杂,现在一般不会这样做,而是采用 gitlab、gogs 之类的 web 管理进行代替,在此就不在演示。
GIT 协议
Git 协议是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。
优点:目前,Git 协议是 Git 使用的网络传输协议里最快的。 如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。
缺点:Git 协议缺点是缺乏授权机制。 而且 9418 是一个非标准端口,一般防火墙不会开放。
演示 GIT 协议的使用
cd demo.git/
# 创建一个空文件,表示开放该项目
touch git-daemon-export-ok
# 启动守护进程
$nohub git daemon --reuseaddr --base-path=/data/git-repository/ /data/git-repository/ &
#本地克隆远程项目
git clone git://ip:9418/demo.git
二、基于 gogs 快速搭建企业私有 GIT 服务
gogs 介绍安装
Gogs 是一款开源的轻量级 Git web 服务,其特点是简单易用完档齐全、国际化做的相当不错。其主要功能如下:
提供 Http 与 ssh 两种协议访问源码服务
提供 WEB 界面可查看修改源码代码
提供较完善的权限管理功能、其中包括组织、团队、个人等仓库权限
提供简单的项目 wiki 功能
提供工单管理与里程碑管理
下载安装
下载:https://gogs.io/docs/installation 选择 linx amd64 下载安装
文档:https://gogs.io/docs/installation/install_from_binary
安装:
解压之后目录:
运行:
#前台运行
./gogs web
#后台运行
$nohup ./gogs web &
默认端口:3000
初次访问 http://<host>:3000 会进到初始化页,进行引导配置。
gogs 基础配置
邮件配置说明:
邮件配置是用于注册时邮件确认,和找回密码时候的验证邮件发送。其配置分为两步:
第一:创建一个开通了 smtp 服务的邮箱帐号,一般用公司管理员邮箱。我这里用的是 QQ 邮箱。
第二:在{gogs_home/custom/conf/app.ini} 文件中配置。
邮件设置
设置文件:{gogs_home/custom/conf/app.ini}
ENABLED = true
HOST=smtp.qq.com:465
FROM=11111111@qq.com>
USER=
PASSWD=
ENABLED =true 表示启用邮件服务
host 为 smtp 服务器地址,(需要对应邮箱开通 smtp 服务 且必须为 ssl 的形式访问)
from 发送人名称地址
user 发送帐号
passwd 开通 smtp 帐户时会有对应的授权码
重启后可直接测试
管理员登录==》控制面版==》应用配置管理==》邮件配置==》发送测试邮件
gogs 定时备份与恢复
备份与恢复:
#查看备份相关参数
./gogs backup -h
#默认备份,备份在当前目录
./gogs backup
#参数化备份 --target 输出目录 --database-only 只备份 db
./gogs backup --target=./backupes --database-only --exclude-repos
#恢复。执行该命令前要先删除 custom.bak
./gogs restore --from=gogs-backup-20180411062712.zip
#自动备份脚本
#!/bin/sh -e
gogs_home="/home/apps/svr/gogs/"
backup_dir="$gogs_home/backups"
cd dirname $0
# 执行备份命令
./gogs backup --target=$backup_dir
echo 'backup sucess'
day=7
#查找并删除 7 天前的备份
find $backup_dir -name '*.zip' -mtime +7 -type f |xargs rm -f;
echo 'delete expire back data!'
#添加定时任务 每天 4:00 执行备份
# 打开任务编辑器
crontab -e
# 输入如下命令 00 04 * * * 每天凌晨 4 点执行 do-backup.sh 并输出日志至 #backup.log
00 04 * * * /home/apps/svr/gogs/do-backup.sh >> /home/apps/svr/gogs/backup.log 2>&1
客户端公钥配置与添加
Git 配置
#Git 安装完之后,需做最后一步配置。打开 git bash,分别执行以下两句命令
git config --global user.name “用户名”
git config --global user.email “邮箱”
#git 自动记住用户和密码操作
git config --global credential.helper store
SSH 公钥创建
1、打开 git bash
2、执行生成公钥和私钥的命令:ssh-keygen -t rsa 并按回车 3 下
3、执行查看公钥的命令:cat ~/.ssh/id_rsa.pub
4、拷贝 id_rsa.pub 内容至至服务器~/.ssh/authorized_keys 中
版权声明: 本文为 InfoQ 作者【IT视界】的原创文章。
原文链接:【http://xie.infoq.cn/article/15346e8b2d7009967c1b33ef3】。文章转载请联系作者。
评论