搭建自己的 Git 服务器 - Go语言中文社区

搭建自己的 Git 服务器


640?wx_fmt=jpeg


根据 RhodeCode[1] 在 2016 年做过的一项分析报告 Version Control Systems Popularity in 2016[2],在如今的 VCS(版本控制系统)领域,Git 几乎已经一统江山,在选择自己的 VCS 时,有 87% 的人会选择使用 Git,排在第二名的 SVN 只占 6%,无论是从 Google Trends,还是在 Stack Overflow 上的提问,都可以看到 Git 的爆发式增长。另外,根据 Eclipse 的社区调查 (Eclipse Community Survey),在 2010 年前后,SVN 的使用率都远超其他几款 VCS,从 2010 年开始,SVN 的使用率开始快速下滑,相应的,Git 的使用率快速上升,并在 2014 年超过了 SVN。 
640?wx_fmt=jpeg
现在,Git 已经成为了程序员的必备技能,越来越多的企业开始采用 Git。在开源的世界里,GitHub 是程序员聚集的狂欢之地,但这并不适合企业的私有项目,虽然 GitHub 也支持创建私有项目,但是搭建一个自己的 Git 服务器在很多时候可能是更好的选择,这篇博客将介绍并学习几种搭建 Git 服务器的方法。
Git 支持四种不同的传输协议:本地协议(Local)、HTTP(S) 协议、SSH(Secure Shell)协议以及 Git 协议,这四种协议在不同的场合有不同的用途,并且各有利弊,可以根据实际情况来选择。
一、本地协议

640?wx_fmt=png


本地协议是 Git 最基本的协议,当我们想在本地做一些 Git 实验时,这将非常有用。我们首先建立两个目录:/git/repo 和 ~/working,前者作为远程版本库,后者作为本地工作目录。
  1. aneasystone@little-stone:~$ sudo mkdir -p /git/repo

  2. aneasystone@little-stone:~$ sudo git init --bare /git/repo/test.git

  3. 已初始化空的 Git 仓库于 /git/repo/test.git/


我们在 /git/repo 目录通过 git init --bare 命令创建一个裸仓库(bare repository,即一个不包含当前工作目录的仓库),只要这一步,我们就可以开始使用了。接着我们在工作目录 clone 这个版本库:
  1. aneasystone@little-stone:~$ cd ~/working/

  2. aneasystone@little-stone:~/working$ git clone /git/repo/test.git

  3. 正克隆到 'test'...

  4. warning: 您似乎克隆了一个空仓库。

  5. 完成。


然后我们可以使用 pull、push 就像操作其他的版本库一样。
  1. aneasystone@little-stone:~/working$ cd test/

  2. aneasystone@little-stone:~/working/test$ touch 1

  3. aneasystone@little-stone:~/working/test$ touch 2

  4. aneasystone@little-stone:~/working/test$ git add .

  5. aneasystone@little-stone:~/working/test$ git commit -m 'first commit'

  6. [master (根提交) 4983f84] first commit

  7. 2 files changed, 0 insertions(+), 0 deletions(-)

  8. create mode 100644 1

  9. create mode 100644 2

  10. aneasystone@little-stone:~/working/test$ sudo git push

  11. [sudo] aneasystone 的密码:

  12. 对象计数中: 3, 完成.

  13. Delta compression using up to 8 threads.

  14. 压缩对象中: 100% (2/2), 完成.

  15. 写入对象中: 100% (3/3), 205 bytes | 205.00 KiB/s, 完成.

  16. Total 3 (delta 0), reused 0 (delta 0)

  17. To /git/repo/test.git

  18. * [new branch]      master -> master


本地协议不仅在做 Git 实验时很有用,如果你的团队有一个共享文件系统,可以在这个共享文件系统上创建一个远程版本库,团队成员把这个共享文件系统挂在本地,就可以直接使用本地协议进行协作开发,完全不需要搭建一台专门的 Git 服务器。
二、SSH 协议

640?wx_fmt=png


本地协议虽然简单,但是一般来说并不适用,因为你无法控制用户对共享文件系统的操作,用户拥有 push 权限也就意味着用户对远程目录拥有完整的 Shell 权限,他们有可能会无意甚至有意的修改或删除 Git 内部文件,损坏 Git 仓库。
更安全的做法是使用专门的 Git 服务器,如果你有一台可以使用 SSH 连接的服务器,搭建 Git 服务将会非常简单。首先我们要确保服务器上运行着 SSH 服务(sshd),大多数 Linux 服务器版本都默认包含了该服务,如果没有,可以先安装 openssh-server。然后在服务器上创建 Git 远程版本库:
  1. root@myserver:~# mkdir -p /git/repo

  2. root@myserver:~# git init --bare /git/repo/test.git

  3. 已初始化空的 Git 仓库于 /git/repo/test.git/


然后在本地 clone 这个版本库:
  1. aneasystone@little-stone:~/working$ git clone ssh://root@myserver/git/repo/test.git

  2. 正克隆到 'test'...

  3. root@myserver's password:

  4. warning: 您似乎克隆了一个空仓库。


可以看到和使用本地协议几乎一样,不同的地方在于,在 clone 的时候需要在 URL 前面加上 ssh://root@myserver,你也可以使用 scp 式的写法:
  1. $ git clone root@myserver:/git/repo/test.git


另外一点不同的地方是,每次 pull、push 的时候都需要输入远程服务器的 root 密码。很显然,让每个 Git 用户都使用 root 来访问服务器是一种很不安全的做法,有几种方法可以解决这个问题:
  • 最显而易见的方法是为每个 Git 用户创建一个独立的账号,并分别为他们分配对仓库的读写权限,这种方法行的通,但是对账号的管理非常麻烦,在团队人员不是很多的时候可以尝试,但是并不推荐;

  • 另一种方法是配置 SSH 服务器使用某个已有的认证系统来管理用户,比如 LDAP,这在很多企业中是很常见的,这样可以省去用 adduser 手工管理服务器账号的麻烦;

  • 还有一种方法是只创建一个账号,比如叫做 Git,他对仓库具有读写权限,大家都使用这个账号来访问仓库。这种方法的好处是用户管理起来比较简单,而且可以使用后面介绍的 authorized_keys 文件对用户的公钥进行管理。


下面我们尝试下第三种方法。首先在服务器上创建一个名叫 Git 的账号:
  1. root@myserver:~# adduser git

  2. Adding user `git' ...

  3. Adding new group `git' (1000) ...

  4. Adding new user `git' (1000) with group `git' ...

  5. Creating home directory `/home/git' ...

  6. Copying files from `/etc/skel' ...

  7. Enter new UNIX password:

  8. Retype new UNIX password:

  9. passwd: password updated successfully

  10. Changing the user information for git

  11. Enter the new value, or press ENTER for the default

  12.    Full Name []: git

  13.    Room Number []:  

  14.    Work Phone []:

  15.    Home Phone []:

  16.    Other []:

  17. Is the information correct? [Y/n] Y


再设置一下 Git 仓库的权限(默认情况下,Git 仓库的权限为 rwxr-xr-x,只有创建者 root 有写的权限,也就意味着使用 Git 账号只能 clone pull,不能 push):
  1. # chmod a+w -R /git/repo/test.git


我们这里非常粗暴的使用 chmod a+w 将 Git 仓库设置为对所有人可写,这里可以想一想,如果我们希望设置某些用户对仓库具有只读的权限,该怎么做呢?
然后就可以在本地愉快的进行 Git 操作了:
  1. $ git clone git@myserver:/git/repo/test.git


到这里似乎一切都很正常,但是几次实操之后你就会发现,每次 Git 操作都要输入一次密码,这也太麻烦了,能不能“免密提交代码”呢?首先我们要知道,只要能通过 SSH 登陆到服务器,我们就能操作 Git,所以如果 SSH 能支持免密登陆,我们就可以“免密提交代码”。还好,SSH 支持公钥认证,这种认证方式无需密码登陆。在 Linux 操作系统中,每个用户都可以拥有自己的一个或多个密钥对(公钥和私钥成对出现),这些密钥一般情况会保存在 ~/.ssh 目录下,在开始之前,我们先确认下自己是否已经生成过公钥了,可以看下这个目录下是否有 iddsa.pub 或 idrsa.pub 这样的文件,如果没有,我们通过 ssh-keygen 来生成:
  1. aneasystone@little-stone:~/.ssh$ ssh-keygen

  2. Generating public/private rsa key pair.

  3. Enter file in which to save the key (/home/aneasystone/.ssh/id_rsa):

  4. Enter passphrase (empty for no passphrase):

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/86942851
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-29 21:56:18
  • 阅读 ( 1578 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢