介绍

GitLab 提供外网访问,只需要将 HTTP 端口进行端口转发即可。

问题

使用 Git LFS 时无法拉取更新,会卡住。

使用 Charles 抓包后发现是在下载 LFS 对象时卡住,下载时使用的 URL 是 GitLab 中配置的地址,而不是端口转发后的地址。

地址是从 example/lfstest.git/info/lfs/objects/batch 这个请求返回的结果中有 LFS 对象的完整地址,而这个地址使用的是 GitLab 内部配置的服务器地址。

有人使用 Gitea 遇到相同的内外网同时访问问题,内外网 IP 不同导致 LFS 下载文件失败:

环境

  • macOS 10.14.6
  • Windows 7
  • Git 2.28.0
  • Git LFS 2.11.0

测试

新建只有一个 LFS 文件的工程测试,只需要 LFS 追踪一个图片文件,将图片文件与 .gitattributes 提交就可以创建好一个完整的测试工程。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ git clone http://git.example1.com:8025/example/lfstest
Cloning into 'lfstest'...
Username for 'http://git.example1.com:8025': example
Password for 'http://example@git.example1.com:8025':
warning: redirecting to http://git.example1.com:8025/example/lfstest.git/
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 424 bytes | 424.00 KiB/s, done.
^Cwarning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'

Exiting because of "interrupt" signal.

$ 2m 3s

网址替换

尝试使用 git 配置,发现 Git LFS 下载文件并不会使用这个配置

url.<url>.insteadOf

git config --global url."http://git.example1.com:8025".insteadOf "http://git.example2.com"

VPN

首先尝试使用 VPN,在外网使用 VPN 就像在内网一样,可以非常方便地访问所有内网资源。

简单研究了下不同的 VPN 协议优缺点后,尝试在路由器上直接开启了 L2TP VPN,手机测试没问题,但是使用电信远程电脑测试时,发现无法连接,猜测是电信运营商不允许使用 VPN。

反向代理

尝试使用 caddy server 配置反向代理,这样克隆仓库与访问网站都不用修改地址,与内网使用完全一致。

caddy reverse-proxy --from http://git.example2.com --to http://git.example1.com:8025

右键点击 helper.bat,在弹出的菜单中选择“以管理员身份运行”,不要关闭弹出的窗口,保持后台运行即可。 接下来就可以正常使用 http://git.example2.com/ 访问 GitLab,并且使用 Fork、Sourcetree、TortoiseGit 拉取更新了。

测试

必须使用手机联网模拟外网访问,测试成功后才能说方案可行。

1
2
3
4
5
sudo echo "127.0.0.1 git.example2.com" >> /etc/hosts
sudo killall -HUP mDNSResponder
ping git.example2.com
chmod +x caddy_darwin_amd64
./caddy_darwin_amd64 reverse-proxy --from http://git.example2.com --to http://git.example1.com:8025

经过上述步骤修改 hosts、刷新 DNS 缓存、开启反向代理服务器后,测试克隆 LFS 仓库:

1
git clone http://git.example2.com/example/lfstest

应用

下面介绍如何在 Windows 上快速使用:

将以下内容保存为 hosts

1
127.0.0.1 git.example2.com

将以下内容保存为 helper.bat

1
2
3
copy /y hosts C:\Windows\System32\drivers\etc\hosts
ipconfig /flushdns
caddy_windows_amd64.exe reverse-proxy --from http://git.example2.com --to http://git.example1.com:8025

下载 CaddyServer 并将其与上面两个文件放在同一目录下。Caddy Server 只有单一的一个可执行文件,非常便携好用。

右键点击 helper.bat,在弹出的菜单中选择“以管理员身份运行”,不要关闭弹出的窗口,保持后台运行即可。 接下来就可以正常使用 http://git.example2.com/ 访问 GitLab,并且使用 Fork、Sourcetree、TortoiseGit 拉取更新了。