![根据是否在家庭网络中连接到不同的存储库 URL](https://linux22.com/image/1303081/%E6%A0%B9%E6%8D%AE%E6%98%AF%E5%90%A6%E5%9C%A8%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C%E4%B8%AD%E8%BF%9E%E6%8E%A5%E5%88%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%98%E5%82%A8%E5%BA%93%20URL.png)
我的笔记本电脑上有一份 Subversion 工作副本,NAS 上有相应的存储库。当我不在家时,我会通过加密连接通过互联网更新和提交,该连接解析为我的外部 IP 的域名。当我在家并通过家庭网络连接时,我希望通过未加密连接更新和提交到我的内部(家庭网络)IP。
当我在家时,我不想使用加密或我的外部 IP 地址,因为这两者都会降低连接速度(没有加密且有内部 IP 时为 10 MB/s,有加密和内部 IP 时为 1 MB/s,有或无加密且有外部 IP 时为 0.5 MB/s)。
有什么方法可以让我的办公副本根据我是否连接到家庭网络来引用不同的 URL?或者有其他方法可以解决速度问题吗?
答案1
一些选项:
- 如果是通过 ssh (
svn+ssh://...
),那么您可以编辑您的.ssh/config
以指定主机别名。然后,您可以编写一个脚本,在网络更改时编辑此配置文件,以便别名指向正确的主机名。 - 如果不是(通过
http
或其他方式),您可以运行本地 DNS 服务器来解析一个特殊的域名,您可以根据计算机所在的网络将其解析为正确域名的 IP - (可能比前一个更不疯狂)在本地计算机的某个端口上运行 TCP 中继,并根据您所在的网络将其指向任一服务器。例如,您可以将其绑定到网络 1 上时
localhost:8080
将其转发到网络 2 上时。然后您可能需要从该地址进行检查()。myserver:80
publicserver:80
svn checkout http://localhost:8080/...
只是一些随机的想法,但感觉它们都像是变通方法。也许有更简单的方法。
或者您可能想要切换到像 git 这样的分布式版本控制系统,它将允许您推送到您想要的远程(git push -u someremote branchname
,其中someremote
指的是其中一个服务器)。
答案2
我昨天解决了一个类似的问题,因此我笔记本电脑上的 git repos 可以与台式机上的远程同步,而不必根据我在局域网上还是不在家而使用不同的远程。
我dnsmasq
在桌面上运行,使用以下配置:
domain-needed
bogus-priv
no-poll
local=/localdomain/
addn-hosts=/etc/extra_hosts
/etc/extra_hosts
包含一个条目,其中包含我的 LAN 上桌面的 IP 以及解析为我的外部 IP 的域名,例如
192.168.0.72 jwakely.example.com
然后在我的笔记本电脑上编辑我的 LAN wifi 连接的 NetworkManager 配置为“仅 DHCP 地址”,并将 192.168.0.72 设置为主 DNS 服务器,将我的路由器设置为辅助 DNS 服务器(要在不使用 NetworkManager GUI 的情况下执行此操作,只需设置 DNS1 和 DNS2 以及 PEERDNS=no,或者/etc/resolv.conf
手动输入名称服务器)
一旦我记得允许 DNS 查询(端口 53)通过我的桌面防火墙,它就可以完美运行。
当我使用家庭局域网时,笔记本电脑使用台式机进行 DNS 查询,因此会获取 的内部 IP jwakely.example.com
,而所有其他 DNS 查询都会转发到我台式机的常用 DNS 服务器(恰好是我的 ADSL 路由器)。只有笔记本电脑使用实例dnsmasq
,局域网上的所有其他主机仍照常使用路由器进行 DNS。如果我的笔记本电脑在局域网上,但台式机没有运行,那么笔记本电脑会使用其辅助 DNS 服务器,无法获取 的内部 IP,但这jwakely.example.com
没关系,因为机器反正没有运行。
答案3
我希望您了解 Subversion 的relocate
命令。您可以手动使用它。如果您将使用主机名进行内部和外部访问,它们分别只能在一个位置解析一个主机名,则 svn 在任何与 repo 相关的操作上都会出错,提醒重新定位
另一个(肮脏的)想法是在外部网络中使用 VPN 连接来确保安全使用权到服务器并使用常见的不安全感存储库访问协议 - 在家庭网络中,您无需建立 VPN 链接。这种方式的优点是:单一 URL、按需安全、防错简单