搭建Git服务器
备注:
本文参考于廖雪峰老师的博客Git教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。
知识点
-
apt-get install git
安装git,创建用户adduser username
-
新用户家(home)目录下
.shh/authorized_keys
存放管理连接到Git远程仓库的用户的私钥。 -
git init --bare reponame.git
创建一个空的远程仓库,并将此远程仓库所在目录及子目录的拥有者设置为新用户,chown -R username:usernameGroup sample.git/
-
修改
/etc/passwd
文件,禁用用户shell
终端登陆。
搭建Git服务器
Git远程仓库本质上和本地仓库没有任何区别,只是它能提供永久在线服务
如下演示在Ubuntu
上搭建Git服务器
- 安装git:
$ sudo apt-get install git
- 创建一个git用户,用来运行git服务
$ sudo adduser git
使用
passwd git
为git用户修改密码。
- 创建证书登陆
创建证书登陆,和在使用github
或gitee
时,将公钥上传到远程服务器上一样,Git服务器需要搜集需要登陆的用户端的公钥(用户创建的id_rsa.pub
),
搜集所有需要登陆的用户的公钥,即用户的id_rsa.pub
文件。把公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
默认新建的git用户家(home)目录,没有
.ssh
隐藏目录。可手动创建目录和文件。新建一个用户,其家目录下面默认生成的文件由
/etc/skel
目录里面的内容决定(可自行验证)。
同时
Ubuntu
下新建用户,家(home)目录下的桌面
等目录需要使用新用户登陆ubuntu
桌面后,才会会生成桌面、图片、文档、下载、音乐等目录。
- 初始化Git仓库:
选定一个目录作为Git仓库,假设为/srv/sample.git
,在/src
目录下输入命令
$ sudo git init --bare sample.git
[sudo] git 的密码:
初始化空的 Git 仓库于 /srv/sample.git/
Git会创建一个空的仓库,且没有工作区,只用于共享,所以不应让用户直接登陆到服务器修改工作区。
服务器Git仓库通常.git
结尾。
- 将目录的所有者改为
git
。
$ sudo chown -R git:git sample.git/
- 禁用git用户
shell
登陆
处于安全考虑,新建的git
用户不允许登陆shell
。通过编辑/etc/passwd
文件设置。
打开passwd
文件找到如下行:
git:x:1001:1002:,,,:/home/git:/bin/bash
将其修改为
git:x:1001:1002:,,,:/home/git:/usr/bin/git-shell
此时使用git登陆,将会不允许
$ su git
密码:
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
su
命令用来切换登陆用户
sudo
用来获取root管理员权限,执行命令
su [username]
切换到指定用户,不改变环境变量
su - [username]
切换并改变环境变量为指定用户(常用)
git用户可以正常通过ssh
使用git,但无法登陆shell
,因为为git
用户指定的git-shell
每次一登录就自动退出。
- 克隆远程仓库。
现在就可通过git clone
将远程仓库/srv/sample.git/
克隆下来。
可以设定一个服务器名访问克隆远程仓库。如将
gitsever
设置到本地hosts中,ip为Git服务器的地址。
$ git clone git@gitsever:/srv/sample.git
Cloning into 'sample'...
The authenticity of host 'gitsever (192.168.104.237)' can't be established.
ECDSA key fingerprint is SHA256:SYG7vL********************y597FA.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitsever,192.168.104.237' (ECDSA) to the list of known hosts.
warning: You appear to have cloned an empty repository.
会提示克隆了一个空的git仓库,查看仓库内容。
$ cd sample/
/sample (master)$ ls -al
total 4
drwxr-xr-x 1 win7hostsver 197121 0 May 4 14:29 .
drwxr-xr-x 1 win7hostsver 197121 0 May 4 14:29 ..
drwxr-xr-x 1 win7hostsver 197121 0 May 4 14:29 .git
之后可以使用这个远程库进行git的操作、同步等。
公钥的管理
如上,一个简单的git服务器已经搭建完成。然后可以添加其他的仓库、其他用户的公钥等进行管理。
- 公钥路径位置:
/home/git/.ssh/authorized_keys
但是对于大型或者多人使用和管理的git服务器,可以使用Gitosis管理公钥。
git服务器仓库的权限管理
git本身是为了托管linux
代码而开发的,所以注重开源精神,不支持权限控制。
但Git提供了相关的钩子(hook),可以借此编写一系列脚本来控制对仓库的提交等操作,从而实现控制权限。Gitolite就是一个提供管理权限的工具,有需要可深入了解