搭建自己的 Git 服务器

搭建自己的 Git 服务器

本文基于 git + ssh 搭建一个共享 Git 服务器,流程适用于 Debian/Ubuntu。

1 安装 Git

sudo apt-get install git

2 创建一个 git 用户用来运行 git 服务

sudo adduser git

会提示输入密码,设置为简单密码即可。

useradd 与 adduser 的区别(CentOS 下两者行为一致,Ubuntu 下不同):

  1. useradd 不会在 /home 下自动创建同名用户目录、不会自动选择 shell,也不设置密码,该用户无法直接登录,需再用 passwd 修改密码;
  2. 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 常见参考

阅读 — · 全站 —
🎸 我的歌单 0 首