• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在服务器上搭建 Git

    现在我们将讨论如何在你自己的服务器上搭建 Git 服务来运行这些协议。

    Note:这里我们将要演示在 Linux 服务器上进行一次基本且简化的安装所需的命令与步骤,当然在 Mac 或 Windows 服务器上同样可以运行这些服务。事实上,在你的计算机基础架构中建立一个生产环境服务器,将不可避免的使用到不同的安全措施与操作系统工具。但是,希望你能从本节中获得一些必要的知识。

    第一步:先把现有仓库导出为裸仓库

    开始架设 Git 服务器前,需要先把现有仓库导出为裸仓库,即一个不包含当前工作目录的仓库。做法直截了当,克隆时用--bare选项即可。裸仓库的目录名一般以.git结尾,像这样:

    git clone --bare my_project my_project.git
    Cloning into bare repository 'my_project.git'...
    done.
    

    该命令的输出或许会让人有些不解。其实 clone 操作基本上相当于git initgit fetch,所以这里出现的其实是git init的输出,先由它建立一个空目录,而之后传输数据对象的操作并无任何输出,只是悄悄在幕后执行。现在my_project.git目录中已经有了一份 Git 目录数据的副本。

    整体上的效果大致相当于:

    cp -Rf my_project/.git my_project.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 会自动修改该仓库目录的组权限为可写(译注:实际上--shared可以指定其他行为,只是默认为将组权限改为可写并执行g+sx,所以最后会得到权限rws。)。

    ssh user@git.example.com
    cd /opt/git/my_project.git
    
    git init --bare --shared
    

    由此可见,根据现有的 Git 仓库创建一个裸仓库,然后把它放上你和同事都有 SSH 访问权的服务器是多么容易。现在已经可以开始在同一项目上密切合作了。值得注意的是,这的的确确是架设一个少数人具有连接权的 Git 服务的全部—只要在服务器上加入可以用 SSH 登录的帐号,然后把裸仓库放在大家都有读写权限的地方。一切都准备停当,无需更多。

    如果设备较少或者你只想在小型开发团队里尝试 Git ,那么一切都很简单。架设 Git 服务最复杂的地方在于账户管理。如果需要仓库对特定的用户可读,而给另一部分用户读写权限,那么访问和许可的安排就比较困难。


    SSH 连接

    如果已经有了一个所有开发成员都可以用 SSH 访问的服务器,架设第一个服务器将变得异常简单。如果需要对仓库进行更复杂的访问控制,只要使用服务器操作系统的本地文件访问许可机制就行了。

    如果需要团队里的每个人都对仓库有写权限,又不能给每个人在服务器上建立账户,那么提供 SSH 连接就是唯一的选择了。我们假设用来共享仓库的服务器已经安装了 SSH 服务,而且你通过它访问服务器。

    有好几个办法可以让团队的每个人都有访问权。

    • 第一个办法:在服务器上,给每个人建立一个账户,然后反复运行adduser并给所有人设定临时密码。
    • 第二个办法:在服务器上,建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥,然后将其加入 git 账户的~/.ssh/authorized_keys文件。这样一来,所有人都将通过 git 账户访问主机。这丝毫不会影响提交的数据—访问主机用的身份不会影响提交对象的提交者信息。
    • 第三个办法:在服务器上,让 SSH 服务器通过某个 LDAP 服务,或者其他已经设定好的集中授权机制,来进行授权。只要每个人都能获得主机的 shell 访问权,任何可用的 SSH 授权机制都能达到相同效果。