原理
很简单,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
首先确认 info/refs 文件是否存在,如果不存在则手动执行以下命令生成该文件
git update-server-info
- 将整个仓库目录移动或拷贝到 http 服务的目录下。http服务只需要最基本的静态文件服务即可。比如用nginx建立一个静态网站如 your-website.com ,并将仓库目录放在网站的根目录下。
- 外部可以通过 http(s)://your-website.com/your-git-repo-name 来拉取仓库。
这样的方法的到的http地址只能用来拉取而不能推送,博主用这个方法主要是为了将自己以前的一些个人仓库导入到github或者是gitea中。而github或gitea是需要git://xxx或http://xxx 形式的拉取地址的。
系列文章
- 自建Git仓库01-在 Linux 服务器上设置 Git 协议支持
- 自建Git仓库02-将普通的Git仓库用http协议对外公开【当前文章】