在拉取本地仓库时如何同时获取远程仓库的代码?

3

常见情况:

deployer$ git clone git://gitserver/project.git
deployer$ cd project
deployer$ ./deploy
Lots of errors!
deployer$ hack --until-it-works deploy
deployer$ git commit -m "fixed it" deploy

糟糕,现在我无法推送代码,因为deployment-account没有正确的密钥。所以,回到我的个人账户。

larsmans$ cd /tmp
larsmans$ git clone /path/to/deployed/project
larsmans$ cd project

但现在我无法推送,因为远程仓库没有设置为原始克隆的远程仓库。
larsmans$ git remote -v
origin  /path/to/deployed/project/ (fetch)
origin  /path/to/deployed/project/ (push)

我能克隆本地目录并获取远程副本吗?我可以轻松为此编写脚本,但也许Git已经内置了它。 在git-clone(1)中找不到相关选项;--mirror 也没有起作用。
1个回答

4

这个场景下不值得编写脚本,因为你最多只需要在每个项目(和人)中执行一次!

实际上,在遇到这种情况时,您几乎肯定已经有了本地仓库,对吧?那么最后一件想做的事情是新建一个克隆库。

相反,只需在现有的常规工作区中执行git remote add deployed /path/to/deployed/project,然后执行git fetch deployed并对deployed/masterrefs/remotes/deployed/master)进行任何您想要的操作 —— 您可以直接将其推送到origin,或者将其检出或者mergemerge --rebase等等。

请注意,如果您可以在服务器上通过ssh运行git(如果您能够入侵),则还可以通过ssh协议从服务器上git pull。而且它是高效的,因为ssh协议只是在远程侧运行git,并使用相同的git协议进行通信,只是通过ssh进行隧道传输。因此,在本地机器上,您应该能够执行git remote add deployed host:/path/to/deployed/project;最好在.ssh/config中配置host的完整主机名、用户名和公钥,但user@host也可以。

在生产服务器上,建议切换回以前的版本,在其他地方进行修复,然后重新推送以限制停机时间。但在测试和预生产环境中,这当然没问题。


实际上,这种情况经常发生——我们要在许多主机上部署,有时需要多次测试功能。我喜欢你的想法,但在我的环境中(大型学术机构的小团队,正在开发原型软件),从部署中拉取到我的工作站需要与系统管理协商防火墙例外或更大的NFS配额。 - Fred Foo
@larsmans:我不同意。如果你可以通过ssh登录到那个站点并在那里运行git(显然可以),那么你可以使用ssh协议从中拉取。 - Jan Hudec
啊,我没想到!我一直以为你需要一个专门的服务器才能让SSH工作。 - Fred Foo
@larsmans:通过ssh拉取只需调用ssh host git upload-pack /path/to/repo。本地拉取也使用相同的命令。其他协议服务器也是标准git的一部分,如git daemon(git协议)、git update-server-info(dumb http)和git-http-backend(smart http),但ssh显然对于任何你拥有ssh访问权限的服务器都是最方便的。 - Jan Hudec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接