Pro Git - Pro Git 4.2 服务器上的 Git 在服务器部署 Git
From Pro Git
Pro Git
professional version control
To help translate the book, please fork the book at GitHub and push your contributions.
在服务器部署 Git
开始架设 Git 服务器的时候,需要把一个现存的仓库导出为新的纯仓库——不包含当前工作目录的仓库。方法非常直截了当。 把一个仓库克隆为纯仓库,可以使用 clone 命令的 --bare 选项。纯仓库的目录名以 .git 结尾, 如下:
$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/
该命令的输出有点迷惑人。由于 clone 基本上等于 git init 加 git fetch,这里出现的就是 git init 的输出,它建立了一个空目录。实际的对象转换不会有任何输出,不过确实发生了。现在在 my_project.git 中已经有了一份 Git 目录数据的副本。
大体上相当于
$ cp -Rf my_project/.git my_project.git
在配置文件中有几个小改变;不过从效果角度讲,克隆的内容是一样的。它仅包含了 Git 目录,没有工作目录,并且专门为之(译注: Git 目录)建立了一个单独的目录。
将纯目录转移到服务器
有了仓库的纯副本以后,剩下的就是把它放在服务器上并设定相关的协议。假设一个域名为 git.example.com 的服务器已经架设好,并可以通过 SSH 访问,而你想把所有的 Git 仓库储存在 /opt/git 目录下。只要把纯仓库复制上去:
$ scp -r my_project.git user@git.example.com:/opt/git
现在,其他对该服务器具有 SSH 访问权限并可以读取 /opt/git 的用户可以用以下命令克隆:
$ git clone user@git.example.com:/opt/git/my_project.git
假如一个 SSH 用户对 /opt/git/my_project.git 目录有写权限,他会自动具有推送权限。这时如果运行 git init 命令的时候加上 --shared 选项,Git 会自动对该仓库加入可写的组。
$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared
可见选择一个 Git 仓库,创建一个纯的版本,最后把它放在你和同事都有 SSH 访问权的服务器上是多么容易。现在已经可以开始在同一项目上密切合作了。
值得注意的是,这的的确确是架设一个少数人具有连接权的 Git 服务的全部——只要在服务器上加入可以用 SSH 接入的帐号,然后把纯仓库放在大家都有读写权限的地方。一切都做好了,无须更多。
下面的几节中,你会了解如何扩展到更复杂的设定。这些内容包含如何避免为每一个用户建立一个账户,给仓库添加公共读取权限,架设网页界面,使用 Gitosis 工具等等。然而,只是和几个人在一个不公开的项目上合作的话,仅仅是一个 SSH 服务器和纯仓库就足够了,请牢记这一点。
小型安装
如果设备较少或者你只想在小型的开发团队里尝试 Git ,那么一切都很简单。架设 Git 服务最复杂的方面之一在于账户管理。如果需要仓库对特定的用户可读,而给另一部分用户读写权限,那么访问和许可的安排就比较困难。
SSH 连接
如果已经有了一个所有开发成员都可以用 SSH 访问的服务器,架设第一个服务器将变得异常简单,几乎什么都不用做(正如上节中介绍的那样)。如果需要对仓库进行更复杂的访问控制,只要使用服务器操作系统的本地文件访问许可机制就行了。
如果需要团队里的每个人都对仓库有写权限,又不能给每个人在服务器上建立账户,那么提供 SSH 连接就是唯一的选择了。我们假设用来共享仓库的服务器已经安装了 SSH 服务,而且你通过它访问服务器。
有好几个办法可以让团队的每个人都有访问权。第一个办法是给每个人建立一个账户,直截了当但过于繁琐。反复的运行 adduser 并且给所有人设定临时密码可不是好玩的。
第二个办法是在主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥,然后将其加入 git 账户的 ~/.ssh/authorized_keys 文件。这样一来,所有人都将通过 git 账户访问主机。这丝毫不会影响提交的数据——访问主机用的身份不会影响commit的记录。
另一个办法是让 SSH 服务器通过某个 LDAP 服务,或者其他已经设定好的集中授权机制,来进行授权。只要每个人都能获得主机的 shell 访问权,任何可用的 SSH 授权机制都能达到相同效果。