前言
这里主要描述自建 git 服务器时采用 ssh 协议的情况。对 gitlab
、Jenkins
平台刚兴趣的可以查看
SSH协议
SSH协议是常见的安全传输协议之一,采用非对称加密的原理,协议效率很高,数据传输前会被尽可能地压缩。
缺点是没办法匿名访问,大型开源项目并不倾向于采用SSH,因为要想通过SSH访问仓库,用户必须首先有服务器的SSH访问权限,这个对于公钥的维护而言成本太高。像 github
就需要用户先上传自己的 SSH 公钥才能进行SSH的相关操作。
搭建流程
对于仓库导出以及建立SSH连接没有顺序要求,这里先建立SSH连接。
本地协议的话:git clone /path/to/git/repository/xxx.git
建立SSH访问权限
git 服务器搭建中最复杂的就是用户权限管理,比如允许部分人拥有只读权限,另一部分人拥有完整的读写权限。
- 如果团队在 git 服务器上都有一个账号。使用
chmod
给 git 仓配置相应的权限即可。 - 如果团队不都在 git 服务器上拥有账号 。推荐使用这种方法,git 服务器本身就不该开放给所有人登录。
可以创建一个叫 git 的用户,然后将拥有写权限的用户的SSH公钥加入~/.ssh/authorized_keys
中。这样大家其实是使用这个 git 用户来访问 git 服务器,使用SSH公钥登录,也解除了每次SSH登录都需要输入密码的痛苦了
。
添加 git 用户
sudo adduser git
su git -l
cd
mkdir .ssh & chmod 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
生成个人和 git 服务器 SSH 密钥对
client:
ssh-keygen -t rsa -C "your_email"
git server:
ssh-keygen
client 拷贝/发送自己的公钥给 git server
以下指令是拥有 git 用户的密码情况下使用
scp ~/.ssh/xxx.pub git@server_ip:/home/git/
如果没法登录到 git 服务器,client 也可以通过邮件发送公钥给 git server 管理员,请求添加即可。
创建 git 仓库
已有代码仓库部署
把现有 git 仓库导出成一个新的裸仓库(不含有工作目录,可以大体上认为就是 .git
),然后部署到 git 服务器上。
部署的目录可以自己指定。
git clone --bare ~/xx/project_name project_name.git
scp -r project_name.git git@server_ip:/home/svr/git/
这样一来, git 仓库的数据就拷贝到 git 服务器上 git 用户目录下的 svr/git 文件夹下了
全新的代码仓库部署
直接在 git 服务器上建立一个裸仓库。
使用 git 用户登录到 git 服务器上
cd ~/svr/git/my_project.git
git init --bare
访问 git 服务器
拥有权限访问 git 服务器的用户已经在authorized_keys
里,远程仓库也已经建立好。使用如下命令可访问 git 服务器。
git clone git@server_ip:/home/git/svr/git/project.git
clone 默认会添加到 origin,也可以手动添加到远程地址上方便访问
git remote add origin xxx
限制shell访问
上面的配置完后所有加入authorized_keys
里的用户都能够使用 git 用户登录到 git 服务器上。可以在etc/passwd
文件更改shell有关的内容,也可以使用git-shell
来限制 git 用户只能进行git相关的操作。方法就是让 git 用户登录时使用的shell为git-shell
。如此一来就不具备普通shell的访问权限了。