【发布时间】:2015-07-05 03:39:17
【问题描述】:
我的机器上有我的 Git 存储库,它没有自己的公共 IP,在家里;我想在我的网络服务器上克隆这个 repo。反向隧道允许我从我的机器拉到服务器是否正确?我发出什么命令来执行克隆?我的本地机器运行 Windows;服务器运行 Ubuntu。
【问题讨论】:
我的机器上有我的 Git 存储库,它没有自己的公共 IP,在家里;我想在我的网络服务器上克隆这个 repo。反向隧道允许我从我的机器拉到服务器是否正确?我发出什么命令来执行克隆?我的本地机器运行 Windows;服务器运行 Ubuntu。
【问题讨论】:
原则上,你可以这样做
ssh -R 2222:localhost:22 username@webserver.com
然后在你的网络服务器上使用
git clone ssh://user@localhost:2222/path/to/repo.git/
不过,这会加密您的数据两次。
或者,您可以使用 git 支持的任何其他协议,并为这些协议转发正确的端口。
你也可以把这样的部分放到~/.ssh/config中:
Host my-server
HostName localhost
ForwardX11 no
Port 2222
然后你可以使用这个克隆命令:
git clone git@my-server:mytools/projectName.git。 (这允许您存储不属于localhost 的服务器密钥,并使您的 git config 中的 URL 更清晰。)
对于您的服务器(隧道服务器和最终主机),您通常希望根据公钥授权进行身份验证,为此您应该将私钥(例如 id_rsa)放在 ~/.ssh 目录中。 (并且那里的所有文件,特别是私钥,应该只对您的用户可读,而目录应该只对您的用户可写。)
所有这些都不是特定于隧道的,而是通用 SSH 的东西。
【讨论】:
ssh user@localhost:2222 登录到你的 Windows 机器。这行得通吗?
您可以将更改推送到 Web 服务器,而不是尝试拉取它们:
在网络服务器上设置一个仓库:
cd /somedir
git init --bare
从您的开发机器推送到该存储库:
git remote add web user@web:/somedir
git push web master
如果您想推送到非裸仓库(例如,如果您的 Web 应用程序在结账时运行),那么您需要推送到当前未签出的分支,然后合并。
即在您的开发机器上:
git push web master:master-from-dev
然后登录网络机器并执行:
git merge master-from-dev
【讨论】:
另一种选择是在您的服务器上设置一个裸存储库,然后从本地计算机推送到它。从那里拉到服务器的存储库中。
有很多优点:
有关详细说明,请参阅 http://joemaller.com/990/a-web-focused-git-workflow/。
【讨论】:
我自己没有尝试过这个(并且不能说它与 NAT 的处理效果如何),但听起来DynDNS 可能是解决您问题的一种方法。它为您的家用机器提供了一个公共 URL,甚至可以自动更新。来自他们的support page:
免费的Dynamic DNS 服务提供了一个易于记忆的 用于快速远程访问您的 URL 网络。这使您可以到达 家庭服务,例如个人 网站、安全摄像头、VPN、游戏 服务器等,使用简单的网络 地址之类的 http://myhome.dyndns.org/,而不是 一个毫无意义、不断变化的 IP 地址如http://123.45.67.89。你 可以learn more about how Dynamic DNS works here.
当然,因为这也会让其他人更容易访问您的计算机,所以您还应该采取适当的安全措施。但是,如果它有效,您可以通过 DynDNS URL SSH 进入您的家庭计算机。
【讨论】:
您可以在防火墙上打开 ssh 端口并在路由器上设置路由以访问您的计算机。您只需要路由器公开的 ip。
【讨论】: