搭建自己的 Git 服务器
本文基于 git + ssh 搭建一个共享 Git 服务器,流程适用于 Debian/Ubuntu。
1 安装 Git
sudo apt-get install git
2 创建一个 git 用户用来运行 git 服务
sudo adduser git
会提示输入密码,设置为简单密码即可。
useradd与adduser的区别(CentOS 下两者行为一致,Ubuntu 下不同):
useradd不会在/home下自动创建同名用户目录、不会自动选择 shell,也不设置密码,该用户无法直接登录,需再用passwd修改密码;adduser会自动创建/home下的同名目录、设置 shell,并在创建时提示输入密码,更友好。删除用户:
userdel只删除用户不删除相关目录文件;userdel -r连同用户目录一起删除。
3 创建保存公钥的 authorized_keys 文件
收集所有需要登录的用户的公钥(即各自的 id_rsa.pub),导入 /home/git/.ssh/authorized_keys,一行一个:
cat your_id_rsa.pub >> /home/git/.ssh/authorized_keys
完成后重启 ssh 服务(ssh 默认监听 22 端口,如需使用其他端口可修改
/etc/ssh/sshd_config中的Port):
/etc/init.d/ssh restart
4 初始化 Git 仓库
选择目录作为仓库存放位置,假定为 /srv/sample.git:
$ sudo git init --bare sample.git
$ sudo chown -R git:git sample.git
裸仓库(bare)没有工作区,因为服务器上的 Git 仓库纯粹用于共享,不允许用户直接登录去改工作区,且裸仓库目录通常以 .git 结尾。改 owner 为 git 以便 git 用户可写。
5 禁用 shell 登录(可选但推荐)
出于安全考虑,限制第二步创建的 git 用户只允许通过 SSH 使用 Git,不允许登录 shell。编辑 /etc/passwd,把:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样 git 用户通过 SSH 可以正常使用 Git,但每次登录 shell 会随即退出。
6 克隆远程仓库
在各自的电脑上运行:
$ git clone git@<server>:/srv/sample.git
如果 git 服务器跑在容器中(假设主机 IP 为 192.0.2.6,端口映射为 8091:22),则这样访问:
git clone ssh://git@192.0.2.6:8091/home/git/sample.git
注意:
/srv/sample.git是 git 服务器上的绝对路径。
7 仓库的迁移
从 GitHub 克隆下来的项目(如 microblog)想推送到自己的 Git 服务器。
前提:git 服务器地址 192.0.2.4,项目绝对路径 /home/git/microblog/microblog.git。
记得修改 microblog.git 的所有者权限,因为 push 时需要相关权限:
chown -R git:git microblog
(1) 在 git 服务器上创建裸仓库:
git init --bare microblog.git # 当前目录为 /home/git/microblog
(2) 修改本地 .git/config 中的 URL。.git/config 位于从 GitHub 拷贝下来的项目根目录下:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
#url = git@github.com:example/microblog.git
url = git@192.0.2.4:/home/git/microblog/microblog.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
(3) 推送:
git push origin master
7.1 添加已有的代码仓库到自建的 Git 服务器
(1)在 git 服务器中创建代码仓库(假定当前目录为 /home/git/projects),切到 git 用户:
su git
cd /home/git/projects
git init --bare gear.git
git init --bare nginx-front-conf-lua.git
(2)在已有的本地仓库中,删除原有 origin,并添加镜像方式(--mirror=fetch --mirror=push)推送与拉取的远端:
git remote rm origin
git remote add origin --mirror=fetch --mirror=push ssh://git@192.0.2.6:8091/home/git/projects/gear.git
(3)执行 push 将本地代码上传到仓库:
git push origin --all
(密码登录,或把公钥放到 /home/git/.ssh/authorized_keys 后重启 ssh)
8 权限与公钥管理扩展
- 小团队:把每个人的公钥收集起来放进
/home/git/.ssh/authorized_keys即可。 - 大规模团队:使用 Gitosis 管理公钥,或使用 Gitolite 在服务器端提供精细到分支/目录的读写权限控制。
9 常见参考
- 廖雪峰《搭建 Git 服务器》
- Pro Git 官网