在 Ubuntu 中架设 git 服务器

自打有个 VPS ,真是想怎么折腾怎么折腾。以前经常像别人推荐 git,那有人就会问,git 这么好,那你来搭一个?奈何那时只会用不会搭,现在有机会了,自己搭了一个,暂时没有用到 Gitosis ,过程既轻松又愉悦,在这里分享记录一下

安装

1
2
sudo apt-get update
sudo apt-get install git

创建用户

git 自带了 git-shell 工具,它可以限制 Git 库所属用户的活动范围,只要把它设为此用户登入的 shell,那么该用户就无法使用普通的 bash 或者 zsh 等 shell 程序

1
2
3
which git-shell
/usr/bin/git-shell
sudo useradd -m -s /usr/bin/git-shell git

这里我们创建了一个带用户主目录的 git 用户,shell 指定为 git-shell

创建登录公钥

客户端可以运行 ssh-keygen 命令来生成SSH 公(秘)钥,参数 t 为加密方式(除 rsa 外还有 ecdsa 和 dsa ,ecdsa 生成的密钥更小,安全性更高,但貌似有些厂商因专利问题,暂未提供支持),参数 C 为 comment

1
ssh-keygen -t rsa -C "your_email@example.com"

它先要我们确认保存公钥的位置(.ssh/id_rsa),然后它会让我们重复一个密码两次,如果不想在使用公钥的时候输入密码,可以留空

1
2
3
4
5
6
7
8
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/cheney/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/cheney/.ssh/id_rsa.
Your public key has been saved in /Users/cheney/.ssh/id_rsa.pub.
The key fingerprint is:
34:c5:72:56:5d:09:e8:b8:95:ae:2d:3c:80:15:12:05 your_email@example.com

接下来,我们在服务端 git 用户家目录下创建 .ssh 文件夹:

1
2
sudo mkdir .ssh
sudo chown -R git:git .ssh

可以把客户端用户的公钥放在 /home/git/.ssh/ 目录下,然后将公钥的内容输出重定向到 /home/git/.ssh/authorized_keys 文件:

1
cat id_rsa.pub >> authorized_keys

这里需要注意用户权限问题,authorized_keys这个文件的权限一般设置为 600,不能给它的其他用户设置可写权限,比如图方便给个 666 等,否则就是下面这个情形:

1
2
3
4
it clone git@zencode.cn:/home/git/test.git
Cloning into 'test'...
Permission denied (publickey).
fatal: Could not read from remote repository.

新建 git 仓库

在 git 家目录下,创建一个裸仓库:

1
sudo git init --bare test.git

记得要修复权限,不然客户端可能会无法 push

1
sudo chown -R git:git test.git

提交代码到远程仓库

现在,我们可以克隆远程仓库了:

1
git clone git@zencode.cn:/home/git/test.git

最后,提交代码后,第一次 push 到远程:

1
git push -u origin master