原理

很简单,git本来就支持http协议(官方说法是http哑协议)。只要将你的git仓库放在一个提供http静态文件的网站目录下即可通过http协议访问。

HTTP 传输协议

Git HTTP 协议主要分为两种,一种是哑协议(Dump),另外一种是智能协议(Smart),也是目前各个提供 Git 托管服务普遍所采用的协议。

官方文档:https://github.com/git/git/blob/master/Documentation/technical/http-protocol.txt

HTTP 哑协议(Dump Protocol)

在 Git 1.6.6 版本之前是只提供哑协议的,哑协议只需要一个标准的 HTTP 静态文件服务,这个服务只需要能够提供文件的下载即可,Git 客户端会自动进行文件的遍历和拉取。

无论是哑协议还是智能协议,Git 在使用 HTTP 协议进行 Fetch 操作的时候,总是要先获取 info/refs 文件,这个文件是在裸仓库的目录下的,如果你已经有一个通过 Git 拉取的仓库,这个文件就在仓库根目录的 .git/info/refs 。

注意,这个文件一般情况下默认是没有的,它需要你在Git目录中执行 git update-server-info 进行生成:

操作示例

假设你已经拥有一个用类似以下方法建立的一个git仓库

mkdir your-git-repo-name
cd your-git-repo-name
git init --bare
  1. 首先确认 info/refs 文件是否存在,如果不存在则手动执行以下命令生成该文件

    git update-server-info

  2. 将整个仓库目录移动或拷贝到 http 服务的目录下。http服务只需要最基本的静态文件服务即可。比如用nginx建立一个静态网站如 your-website.com ,并将仓库目录放在网站的根目录下。
  3. 外部可以通过 http(s)://your-website.com/your-git-repo-name 来拉取仓库。

这样的方法的到的http地址只能用来拉取而不能推送,博主用这个方法主要是为了将自己以前的一些个人仓库导入到github或者是gitea中。而github或gitea是需要git://xxx或http://xxx 形式的拉取地址的。

系列文章

Last modification:October 10, 2023
If you think my article is useful to you, please feel free to appreciate