前言:原生GIT版本服务器指使用Linux内核自带的GIT软件来构建版本服务器,而不采用Git-lab、SCM-Manager等非Linux原生系统。本文提供原生GIT安装、配置、测试和安全性设置。以下实验针对CentOS 7.9,其他类型的Linux和版本均大同小异。
原生Git默认访问方式采用SSH协议,而大部分非原生Git工具采用HTTP/HTTPS协议。
(资料图片)
HTTP/HTTPS协议是目前版本管理公有云(例如:Gitee、GitHub)采用的通用访问方式。SSH和HTTP/HTTPS相比并不复杂,使用命令行或者图形界面操作均相同。HTTP/HTTPS的优点是共享方便,就像GitHub一样,几万个用户拉取版本,但是大多数用户并不修改。但是,企业内部的版本服务器并不需要太多共享,反而需要严格的访问和权限控制,版本最终应控制到版本管理员手上。
原生git服务器优点有:
首先,原生git服务器内置于Linux内核,不需要安装,多数管理员都有使用经验,并且多数操作系统都包含了它及相关的管理工具。
其次,原生git服务器相比HTTP/HTTPS更加安全。不但所有传输数据都要经过授权和加密,而且在需要时可以利用Linux操作系统的用户组和用户权限来控制访问和权限,粒度可以细到每个用户的读、写、执行操作。
最后,原生git服务器相比HTTP/HTTPS更高效,在传输前也会尽量压缩数据。HTTP/HTTPS是更高层的应用协议,封装次数更多,导致延迟多,故障也会相对更多。
执行如下命令安装工具:
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel #安装支撑工具curl、openssl、perl等
执行情况如下图:
依赖关系:
询问时输入y:
密钥提示时输入y:
执行如下指令安装git服务器:
yum install git #git一般在CentOS7已经安装好了,为了保证正确性还是要执行一遍
执行效果如下:
执行如下命令在CentOS中创建git用户组为git_group(为每个部门、小组新建一个CentOS用户组):
groupadd git-group #版本管理组groupadd maintain-group #运维组
创建git账户(为每个人新建一个CentOS用户):
useradd git-admin -g git-group #默认版本管理员账号passwd git-admin #设置默认版本管理员密码
在本地git使用clone、push、pull操作时,需要输入CentOS上的用户名和密码,这样做更加安全。但是,某些情况下需要免密,例如频繁push的版本管理员自身或者某些开发人员,可以执行如下操作:
首先,到windows用户目录下,例如c:\user\<用户名>\.ssh,查找id_rsa和id_rsa.pub文件,如果已经存在,则把id_rsa.pub文件提供给版本管理员。否则,所有人员在windows操作系统中,打开Git Bash,执行ssh-keygen,如下:
ssh-keygen
一直回车:
到默认目录中查看密钥文件:
需要免密的人员都需要创建密钥对,并把公钥提供给版本管理员。
其次,版本管理员上传公钥文件id_rsa.pub到CentOS操作系统,存放位置是对应人员在CentOS上的对应用户的.ssh目录中。
如果没有.ssh目录,版本管理员执行如下命令:
su git-admin #切换到默认管理员账户cd ~ #进入默认管理员的home目录mkdir .ssh #创建认证目录cd .ssh #进入认证目录touch authorized_keys #创建认证密钥文件
如下图:
随后马上执行如下指令:
chmod 700 /home/git-admin/.ssh/ #修改认证目录权限chmod 600 /home/git-admin/.ssh/authorized_keys #修改认证密钥文件权限
如下图:
把需要免密人员的公钥上传到服务器,推荐采用FinalShell的上传功能,如下图:
最后,追加对应人员的公钥到authorized_keys文件中,如下:
cat id_rsa.pub >> authorized_keys #默认公钥文件名id_rsa.pub。该指令比vim要好。
切换到默认管理员账户,创建版本仓库的根目录:
su - #切换到root账户cd /var #进入可变数据目录varmkdir repositories #创建版本仓库根目录chown git-admin:git-group /var/repositories/ #修改版本仓库根目录拥有者chmod 711 /var/repositories/ #修改版本仓库根目录权限,拥有者(版本管理员git-admin)有读、写、执行权限,管理员组git-group有执行权限,其他组有执行权限
(备注:
chmod 命令可以用来修改用户对某个文件或文件夹的权限。
Linux 系统中文件的基本权限由 9 个字符组成。r、w、x 分别表示读、写、执行权限。第1/2/3个字符针对拥有者,第4/5/6个字符针对拥有者所属组,第7/8/9个字符针对其他组。
我们可以使用数字来代表各个权限,各个权限与数字的对应关系如下:
r --> 4
w --> 2
x --> 1
例如: rwxrw-r-x,拥有者、所属组和其他人分别对应的权限值为:
拥有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2+0 = 6
其他组 = r-x = 4+0+1 = 5
所以,此权限对应的权限值就是 765。
)
接下来,我们使用如下指令创建一个仓库。可以约定规则:仓库名称采用英文,中文会有带了一些故障,英文单词之间使用连字符分隔,仓库名称后面必须要带.git。
git init --bare library-manager.git #--bare表示空白仓库,library-manager是仓库名称chown -R git-admin:git-group library-manager.git/ #调整版本仓库目录的拥有者,必须加-R参数,表示递归子目录。拥有者是默认版本管理员chmod 760 -R library-manager.git/ #修改目录权限,拥有者有读、写、执行权限,版本管理组git-group有读、写权限,其他组没有权限
(1)创建测试账户,然后测试上一步创建的版本仓库。
例如:使用交付人员fengyonghua的名字来创建CentOS账户:
useradd feng-yong-hua #新增测试账户:运维人员冯永华,我们可以约定:全拼中间加连字符usermod -a -G maintain-group feng-yong-hua #把fengyonghua加入到运维组passwd feng-yong-hua #设置初始密码,后续密码需要版本管理员来帮运维人员冯永华修改,密码规则可以定为:姓名第一个字母+@+组名的第一个字母+随机数。
(2)在一台windows办公电脑上安装git和tortoisegit(参见2.2节)之后,启动git bash,输入指令:
git clone feng-yong-hua@192.168.183.138:/var/repositories/library-manager.git #克隆版本仓库library-manager到本地计算机
其中,192.168.183.138是版本服务器的IP地址,可以使用指令:
Ifconfig #查看CentOS服务器的网卡配置
如上图,第一个网卡ens33是有效的,IP地址为192.168.183.138。
上面的Git clone指令执行结果报错说不能读版本服务器上的仓库,如下图:
这是因为指定library-manager.git权限时只有git-group组有读写权限,而其他组没有权限,feng-yong-hua是运维组的,所以没有权限。只需再执行如下指令:
chmod 755-R library-manager.git/ #修改目录权限,拥有者有读、写、执行权限,版本管理组git-group有读、执行权限,其他组有读、执行权限
重新在本地执行git clone指令:
上图表示成功克隆版本服务器上的仓库library-manager.git到本地。
继续测试上传目录功能,在git bash里面执行如下指令来拷贝所需提交的文件夹到本地仓库下属目录中:
cd library-manager/ #进入本地版本仓库下属目录cp -r /d/mywork/版本管理制度 . #拷贝所需提交的文件夹ll #查看拷贝后的目录情况
继续执行如下指令以便于提交该文件夹到本地仓库中:
cd 版本管理制度/ #进入所需提交的文件夹git init #初始化所需提交的文件夹到本地仓库git add . #增加所需提交的文件夹的文件到本地仓库中,即进入暂存区git commit -m "按照集团要求,编写版本管理制度,已定稿" #提交文件到本地仓库,并附加变更说明
继续执行如下指令以便于推送本地仓库到版本服务器的对应仓库中:
git remote add origin feng-yong-hua@192.168.183.138:/var/repositories/library-manager.git #新增版本服务器和版本仓库配置origingit remote -v #查看版本服务器配置git push -u origin master #同步本地版本仓库到版本服务器的library-manager.git仓库master基线中
提示写失败,解决办法是在版本服务器上执行如下指令添加其他组的写权限:
chmod 757-R library-manager.git/ #修改目录权限,拥有者有读、写、执行权限,版本管理组git-group有读、执行权限,其他组有读、写、执行权限
重新在本地执行如下指令:
git push -u origin master #同步本地版本仓库到版本服务器的library-manager.git仓库master基线中
从以上测试步骤看,成功上传“版本管理制度”目录到版本服务器的library-manager.git仓库中,测试成功。
不允许git账户通过SSH登录远程登录到版本服务器,需要禁用CentOS上git账户:git_admin的SSH登录权限。
先切换到root用户,再编辑/etc/passwd文件:
找到下面一行,是git_admin的登录规则:
改为: