CentOS搭建Git服务器及权限管理
声明:本教程,仅作为配置的记录,细节不展开,需要您有一点linux的命令基础,仅作为配置参考。
1. 系统环境
系统: Linux:CentOS 7.2 64位
由于CentOS已经内置了OpenSSH
,如果您的系统没有,请自行安装。
查看ssh版本
1 | ssh -V |
避免系统环境和其他的不一致,请核对您系统的版本,其他发行版请对应修改。
2. 安装git
建议以下操作都切换到root
1 | 请确保您切换到了root账户 |
3. 添加git的管理的账户和设置密码
设置专门管理git的账号非必须,但是建议这么操作。
1 | 添加git账户 |
4. git的权限管理
git仓库的权限管理,我们可以手动进行管理和配置,也可以通过其他辅助工具。如果小团队的话,直接通过ssh公钥进行管理即可,如果大点的团队,最好用gitolite 或者 gitosis,两者都差不多,一个是Perl开发,一个是Python开发。
以下我分别介绍手动管理权限和使用gitolite
管理的方式,注意两者不兼容,不能混用。
5. git的手动权限管理
经过以上步骤,其实服务器的基本已经配置好,但是需要设置权限和配置远程访问git仓库的方式。我们只介绍ssh的方式,https不做介绍。
5.1 配置服务端的ssh访问
切换到git账号,并创建ssh的默认目录和校验公钥的配置文件
1 | 1.切换到git账号 |
此时,服务端的配置基本完成。接下需要把客户端的公钥拷贝到authorized_keys
文件中。
5.2 配置客户端的ssh私钥并上传服务器
以下是客户端创建ssh私钥和拷贝的过程,如果您有私钥越过创建私钥的过程。
请用您的客户端进入终端(如果只有一台电脑,可以用不同的账号模拟不同客户端)
第一步: 创建客户端的ssh私钥和公钥
检查是否已经拥有ssh公钥和私钥:进入用户的主目录。
用户主目录:
Windows系统:C:\Users\用户名
Linux系统:/home/用户名
Mac系统:/Users/用户名
然后查看是否有.ssh
文件夹,此文件夹下是否有如下几个文件。
1 | # 用户主目录的.ssh文件夹下 |
如果没有,那么用ssh-keygen创建ssh的私钥。
1 | ssh-keygen -t rsa |
创建私钥成功后,在查看用户目录是否有意加有了公钥文件id_rsa.pub
第二步: 拷贝私钥到git的服务器
如何把客户端的文件拷贝到服务器端,我建议用scp
命令进行拷贝。
以下以mac系统为例:
1 | 首先进入我的用户主目录的.ssh目录下,注意用户名xxx替换成自己的 |
5.3 服务器端添加客户端的SSH公钥
切换到服务器端,把刚才上传的laoma.pub文件的内容添加到 authorized_keys中,就可以允许客户端ssh访问了。
1 | 切换到git账户 |
到此为止,您配置的客户端应该可以ssh的方式直接用git账号登录服务器。(当然不安全,后面可以控制)
1 | 在客户端用ssh测试连接远程服务器,请将域名aicoder.com换成你的ip地址或者域名 |
5.4 服务器端创建测试git仓库
进入服务器的终端。
1 | 切换到git账号 |
git init --bare 是在当前目录创建一个裸仓库,也就是说没有工作区的文件,直接把git仓库隐藏的文件放在当前目录下,此目录仅用于存储仓库的历史版本等数据。
此时,客户端就可以进行clone或者remote add此仓库了。
5.5 客户端测试连接git远程仓库
客户端,可以新建一个文件夹,初始化一个仓库,然后跟远程服务器上的空仓库建立连接。
1 | 以下shell代码,纯手写没有验证,如果有错误请自行纠正。 |
到此为止,我们就可以尽情的享用git私服了,但是!但是!但是!客户端可以直接ssh登录啊,这是bug,也是不安全的隐患,且看下面怎么禁用git账号的shell登录。
5.6 禁止客户端shell登录
因为前面我们添加了客户端的ssh的公钥到远程服务器,所以客户端可以直接通过shell远程登录服务器,这不安全,也不是我们想要的。且看下面如何禁用shell登录:
第一步:
给 /home/git
下面创建git-shell-commands
目录,并把目录的拥有者设置为git账户。可以直接用git账号登录服务器终端操作。
1 | su git |
此文件夹是git-shell用到的目录,需要我们手动创建,不然报错:fatal: Interactive git shell is not enabled. hint: ~/git-shell-commands should exist and have read and execute access.
第二步:修改/etc/passwd
文件,修改
1 | vim /etc/passwd |
好了,此时我们就不用担心客户端通过shell登录,只允许使用git-shell进行管理git的仓库。
如果有其他小伙伴要连接git服务器,仅需要把他的公钥也添加到authorized_keys即可。
7. git的自动权限管理:gitolite(不要跟上面的步骤混做!!!)
如果团队大点的,我们可以用gitolite
管理,而且使用很方便。
7.1 gitolite的安装和配置
以下配置此承接第5,如果第6步您已经操作,请注意第二步的说明。
第一步:添加gitolite
依赖的perl
的包
1 | yum install 'perl(Data::Dumper)' |
第二步:清空服务器端配置的ssh的公钥
确保:/home/git/.ssh/authorized_keys
文件是空的,或者不存在。如果已经存在,建议你把他改名即可,比如:authorized_keys.bak
第三步:上传管理员的客户端的ssh公钥到服务器
把你管理员电脑的ssh的id_rsa.pub
文件拷贝到服务器的: $HOME/YourName.pub
YourName可以自定义,最好根据不同伙伴的名字命名。
参考:
1 | mac客户端 |
第四步:安装配置gitolite
用git账号登录,并执行如下命令。
1 | 切换到git账号 |
好了,到此位置,管理员就可以直接把默认的远程管理的仓库gitolite-admin直接clone到本地进行管理git服务了。
第五步:管理员在本地管理和配置服务器端的仓库
下载服务器端的远程管理仓库
1 | 下载远程管理仓库, 请把aicoder.com换成你自己服务器的域名或者ip |
7.2 gitolite的权限配置
添加其他开发的小伙伴
把小伙伴的公钥发给管理员。管理员添加到
gitolite-admin
仓库的keydir
目录下,注意文件名字格式为username.pub
,username就是配置权限时的用户名。配置用户对仓库的读写权限
直接修改conf文件夹下的,gitolite.conf文件。简单解释下几个用法:
repo
代表仓库的意思,如果新添加一个repo,代表服务端新建一个空仓库,仓库push到服务端后会自动创建。RW
代表可读可写@all
代表所有人。master
和dev
代表分支
参考:
1
2
3
4
5
6
7
8
9
10
11
12
13= malun
= malun bcd
repo gitolite-admin
RW+ = malun
repo testing
RW+ =
repo om
RW+ =
RW+ master =
RW+ dev =应用修改到服务器端
做好配置后,由管理员把修改push到服务器端,会自动处理。
1 | $ git add conf |
此时登录服务端,查看/home/git/repositories/
目录下是否增加了对应的仓库了呢?
总结
其实配置这些并不繁琐,但是需要你有一定的linux的经验,当然你也可以选择使用GitLab
或者Github
。
最后希望能帮到你。