快速架设一个使用 SSH 的 Git 服务

Git 是非常流行的分布式版本控制工具,很早以前就从 Subversion 转到 Git 了。现在每天用的 Xcode 日常开发,测试和应用部署也都是使用 Git,而且除了版本控制功能之外,也可以使用 Git 很方便的进行应用部署(或网站发布)等工作,所以 Git 基本上是每天工作都离不开的一个工具了。

之前一直在使用 Github 上付费 Git 托管服务,虽然 Github 的代码托管,协作,Wiki 功能,以及 Issue tracking 功能都非常好用。但是随着项目不断增多,Github 最便宜的每月 7 美元 5 个 private 项目的容量很快不够用了。想想反正自己有一台 Linode 的 CentOS 云服务器,于是诞生了自己架一套 Git 服务的念头,就不花钱升级 Github 了。

根据 Git 官方网站 Pro Git 书中的说明,选择使用 SSH 方式简单地架设了一套。为什么选择使用 SSH 方式,因为主要是自己使用,不存在提供给别人公共访问的要求,而且基本每台 Linux 服务器都可以 SSH。Pro Git 中对 Git 可以采用的几种协议的优缺点以及适用场景都有详细介绍。下面是使用 SSH 方式的基本步骤:

有关 Git 使用 SSH 方式的基本知识

要通过 SSH 克隆一个 Git 版本库,我们可以像下面这样指定 ssh:// URL :

$ git clone ssh://user@server:project.git

或者我们也可以不指定一个协议 — 如果没有显式指定的话, Git 假设是 SSH:

$ git clone user@server:project.git

我们也可以不指定一个用户,这样的话 Git 会假设使用的是本地当前登录的用户(和使用 SSH 命令的情形类似)。

下面我们来看一下架设一个自己的 Git 服务需要的几个步骤,假设我们要把一个现有的项目变成能够通过 Git 在服务器上进行管理的项目。

第一步,生成一个本地项目的裸版本库

假设 my_project 是我们在本地的一个 Git 版本库项目目录,通过使用 --bare 参数可以生成 Git 裸版本库

$ git clone --bare my_project my_project.git

也可以不指定后面的 my_project.git 参数,Git 默认会使用同样的名字。

如果我们的 my_project 目录还没有被初始化为一个 Git 版本库项目目录,需要首先进入该目录,初始化 Git,然后把现有的文件添加到版本库。

cd my_project
git init
git add .
git commit -m "初始化版本库"

然后再退出该目录,继续执行上面的 git clone ... 命令。

第二步,使用 scp 命令把 Git 裸版本库上传到我们的服务器上

现在我们已经有了一个裸版本库,下一步就是把它放到服务器上。假设我们已经有了一个名为 git.example.com 的服务器,并且已经可以通过 SSH 进行访问。同时假设我们也在服务器的 /opt 目录下建了一个名为 git 的目录专门用来存放 Git 版本库。我们就可以像下面这样通过拷贝一个裸版本库到服务器上来设置一个新的版本库:

$ scp -r my_project.git user@git.example.com:/opt/git

需要注意的是,如果我们给 SSH 设置了不同的访问端口(不是默认的 22),比如说是8080,那么我们需要用 -P 8080 参数来指定 SSH 使用的端口。

$ scp -r -P 8080 my_project.git user@git.example.com:/opt/git

同时还要注意 scp 使用的用户要具有对 /opt/git 目录的写入权限。

第三步,使用刚刚上传的 Git 版本库

这时候,其他也具有到同一台服务器 SSH 访问权限的用户就可以通过运行下面的命令来克隆我们刚刚上传的项目啦,要求至少对 /opt/git 目录具有读取权限:

$ git clone user@git.example.com:/opt/git/my_project.git

这里同样要注意 SSH 端口的问题,如果不是默认的 SSH 端口,要像下面这样运行命令(注意没有省略 ssh://,以及 8080 端口号放置的位置)

$ git clone ssh://user@git.example.com:8080/opt/git/my_project.git

剩下的就是和通常 Git 的用法一样了,git pull git push

例如:

$ git pull ssh://user@git.example.com:8080/opt/git/my_project.git

希望通过 SSH 之外的其他方式来架设 Git,或者像提供 Git 的公共访问或是希望提供 Web 页面的,更多信息请参考 Git 官方网站上的文章:Git on the server

2013年3月25日更新

如果希望更方便地对本地项目进行 push,可以使用 git remote add <name> <url> 命令增加一个我们刚刚创建的远程版本库的名字,以后想要 push 的时候直接运行 git push <name> 即可,不需要再输入完整的 URL 路径了。例如:

git remote add my_project ssh://user@git.example.com:8080/opt/git/my_project.git
git push my_project

2013年4月11日更新 – 使用 tag

创建一个 tag:

git tag -a v0.1 -m '你的注解'

,其中 “v0.1” 就是 tag 的名字。要注意的是 git push 并不会把 tag push 到服务器版本库中。要使用:

git push my_project master v0.1

这样的命令,其中 master 是本地分支的名称,v0.1 是本地的 tagname。具体请参考:Git – Tagging

原文地址:http://www.tfan.org/build-a-simple-ssh-git-service-in-five-minutes/

回复