最简单的 Git 服务器

作者: 阮一峰

日期: 2022年10月23日

程序员的代码仓库,总是需要托管一份在服务器,这样才保险,也方便使用。

今天就来谈谈 Git 服务器。

一、代码托管服务

一般情况下,都不建议自己搭建 Git 服务器,而要使用现成的服务,也就是代码托管服务。它们都是免费的。

其中,除了最后一家 Gitee 是国内的服务,其他都是国外的服务。

这些外部服务,就不多做介绍了。本文的重点不是它们,而是想谈如果不得不自己搭建 Git 服务器,那该怎么做。

二、Git 服务器软件

自己搭建 Git 服务器的原因,无非就是不方便访问外网,不愿意代码放在别人的服务器,或者有一些定制化的需求。

这时,你可以选择开源的 Git 服务器软件。

这些软件里面,Gogs 的安装是最简单的,但是功能相对比较弱。功能越强的软件,安装越复杂。

如果你只是想远程保存一份代码,并不在意有没有 Web 界面,或者其他功能,那么根本不用安装上面这些软件,一行命令就够了。

三、Git 仓库的 SSH 传输

熟悉 Git 的同学可能知道,Git 默认支持两种传输协议:SSH 和 HTTP/HTTPS。

服务器一般都自带 SSH,这意味着,我们可以什么都不安装,只通过 SSH 就把仓库推到远程服务器。

所以,一条命令就够了。我们只要在远程服务器上,建立同名的 Git 仓库,服务器就搭建好了。


$ git init --bare [仓库名].git

上面命令中,各个部分的含义如下。

(1)git init:初始化一个 Git 仓库。

(2)--bare:表示新仓库不需要工作目录,只建立 Git 数据目录。

(3)[仓库名].git:指定仓库名,比如仓库名是example,那么就要建立一个叫做example.git的 Git 数据目录。

执行这条命令以后,一个最简易的 Git 服务器就诞生了。后面,我们就可以通过 SSH 连接,把本地代码推送到这个远程 Git 仓库了。

四、操作演示

下面,我演示一下整个操作过程。

操作分成两部分,先在远程服务器操作,然后在本地计算机操作。

4.1 远程服务器操作

下面的操作都在远程服务器完成,假设你已经通过 SSH 登录上去了。不熟悉 SSH 的同学可以看参考这篇《SSH 入门》

登录远程服务器的目的,主要是新建一个专门的用户,所有的 Git 操作都通过该用户完成。这一步其实不是必需的,但是这样后期操作比较灵活(比如仓库可以让多人共享)。


$ sudo mkdir /home/git
$ sudo useradd git
$ sudo mkdir -m 700 /home/git/.ssh
$ sudo cp ~/.ssh/authorized_keys /home/git/.ssh/

上面命令的含义如下。

(1)新建新用户的主目录/home/git

(2)新建一个用户,用户名为git

(3)新建新用户的 SSH 目录/home/git/.ssh

(4)把当前用户的公钥拷贝给git用户,以便密钥登陆,详细解释可以参考《SSH 密钥登录》

如果你只用密码登录,不使用密钥登录,那么上面第三步和第四步是不需要的,但是需要为git用户设定密码,命令如下。


$ sudo passwd git

4.2 本机计算机操作

后面的操作都在本地计算机完成。

假定上一小节的远程服务器的 IP 地址是192.168.1.25,本地的 Git 仓库名为example


$ ssh [email protected] git init --bare example.git

上面命令中,ssh [email protected]表示以git用户的身份,登录到远程服务器。后面的部分是 SSH 的一种语法,表示登录后在远程服务器执行的命令,即新建一个远程 Git 数据目录example.git

这条命令运行完,就有了一个 Git 服务器了,然后就可以推送代码了。


$ cd example
$ git remote add myServer [email protected]:example.git
$ git push myServer master

上面的命令先进入本地仓库,为远程服务器加一个别名,然后把代码推送过去。

五、另一种操作方法

上面的例子使用git init --bare命令,在远程服务器新建 Git 数据目录。其实,Git 数据目录就是一个普通目录,直接从本地计算机拷贝过去也可以。


$ scp -r example/.git [email protected]:/home/git/example.git

上面的命令使用scp工具将本地的 example仓库里面的.git子目录,拷贝到远程服务器的目录example.git。这样也能建立 Git 服务器。

六、参考链接

(完)

留言(24条)

好久好久没更了

我在公司服务器(windows server)上通过smb挂载成网络盘符,把一个目录--bare了,也一样当远程仓库用.... 我领悟到,其实可以通过这种方法直接把移动硬盘也设置成远程仓库来用.

gogs的docker部署也就一句话的事吧!
毕竟为了issue跟踪,pull request,镜像这几项功能还是值得用一下的。
不过折腾CI/DI这些复杂的事还是算了。

若是單純想分想 git repo,又不想讓其它使用者設定密鑰,
可以選擇使用 HTTP protocol ,直接在遠端機器的 git repo 中更新必要的 reference 資訊:
git update-server-info

接著在遠端機器用 HTTP server 曝露該 git repo 即可:
git clone http://192.168.1.25/path/to/repo.git

Gitee 已经开始代码审查了,还有敏感词,祝大家好运.

这种方式是直接在根目录创建`[仓库名].git`目录,能否指定对应服务器的目录呢?,比如说:`/home/git/project/aaa`,因为不想每个项目都放置在根目录。

"开源的 Git 服务器软件"理应加上一个Gerrit

关于如何设定远端服务器的路径,操作方式如下所示:

1. 服务器配置

```shell
cd /home/git/project
git init --bare aaa
```

2. 本地配置

```shell
cd /local/repo
git remote add new-remote-name root@ip:/home/git/project/aaa

git push new-remote-name main
```

与文章中的diff就是:服务器端的repo初始化需要手动登录到服务器中进行init初始化。本质上操作原理是一致的。

在「五、另一种操作方法」中拷贝到目标文件夹时丢失了「example」目录名?

@joey:

谢谢指出,已经改过来了。

Fossil 本地在用的代码托管服务(非 git)

是sqlite 团队开发的,如果不追求 git 可以试试。就一个二进制文件,基本功能都有了

gitolite 如果还想web界面之类的 挂个 gitweb 或者 cgit 这种我觉得最简单实用

引用Chunlin Zhang的发言:

"开源的 Git 服务器软件"理应加上一个Gerrit

还有gitblit

还是svn香,又方便又简单。windows搭建一个svn服务器,非常迅速。

其实git本来就支持ssh协议,直接git clone ssh://xxx@xxx/xxx 就可以

感谢分享,以前是在本地设置上传GitHub,搭建Hugo博客。

很好的技术贴

我不大懂,用阮老师这种办法搭好的git服务端,那在本地能push pull commit或查看历史版本吗?
还就就是copy个目录在服务器上而已?有懂的帮我答一下。

不建议自已搭建git服务器?搭建很困难么?放github上再付费私有?国内的话慢得要死。不怕他们劫取商业秘密么?不怕黑客么?太幼稚了。有几家商业公司在这些网站上托管的?真托管的都是几条枪的小公司吧。

引用p的发言:

我在公司服务器(windows server)上通过smb挂载成网络盘符,把一个目录--bare了,也一样当远程仓库用.... 我领悟到,其实可以通过这种方法直接把移动硬盘也设置成远程仓库来用.

这样你就没有提交记录啊,还是git好用一点

为啥 SVN就不用呢?我觉的SVN已经很满足了啊

引用yy的发言:

不建议自已搭建git服务器?搭建很困难么?放github上再付费私有?国内的话慢得要死。不怕他们劫取商业秘密么?不怕黑客么?太幼稚了。有几家商业公司在这些网站上托管的?真托管的都是几条枪的小公司吧。

github创建私有仓库已经不收费了

引用yy的发言:

不建议自已搭建git服务器?搭建很困难么?放github上再付费私有?国内的话慢得要死。不怕他们劫取商业秘密么?不怕黑客么?太幼稚了。有几家商业公司在这些网站上托管的?真托管的都是几条枪的小公司吧。

不建议自己搭建 !== 不建议公司搭建

试了onedev,界面简洁,刚好是我需要的功能

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接