git push remote1-branch到remote2-branch而不检查本地副本

时间:2016-02-17 18:24:11

标签: git

我真的不想在git上签出代码,因为我不会使用它。我只想成为两个遥控器之间的接力。并且,让它们保持同步。有没有办法在git中这样做?

喜欢某种形式:

  

git push client

我从文档中读到最后一个参数必须是本地分支。我不能签出本地副本,因为我不会以任何方式处理它。

总而言之,我只想运行一个:

  

git fetch origin

然后a:

  

git push client origin / *(等效)

将原始提交的所有代码推送到(另一个远程调用的)客户端。

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做,因为git push只需要你(本地)端的提交标识符和远端的分支名称。在路上只有一件事。

来自git fetch的{​​{1}}后,您在origin进行了本地提交,通过名称origin找到。尽管名称如origin/*origin/master,但这些是您的资源库中的名称​​ (他们只是跟踪"分支在{{1}上的位置我们最后一次同步origin/branch)。将origin推送到origin的方法之一就是这个名字origin/master

refspec 的完整语法(在clientorigin/master之类的远程名称之后git push的参数)是:origin。这些部分中的大多数是可选的:前导client(如果存在)设置强制标志。冒号+opt commit-reference : branch-nameopt和分支名称部分是可选的,如果 + 部分是本地分支名称。但是,commit-reference可以是原始SHA-1,也可以是:之类的符号引用,或者commit-reference(甚至HEAD之类的任何其他名称,尽管推送存储不会经常有道理。

您在此处提供的分支名称(如果有)是您的git为远程提供的名称。为了简化一下,这里发生的是你的git调用远程git并说:"在这里,有一些提交,然后请将你的 origin/master设置为SHA- 1个ID stash。" SHA-1 ID来自冒号的左侧侧,而分支名称来自冒号的右侧侧。

当您在左侧使用类似master的远程分支名称时,您必须在右侧指定特定的分支名称。如果您使用除本地分支名称之外的任何内容,则同样适用。但是,当您使用本地分支名称时,可以省略冒号右侧的名称,然后您的git使用您的配置来弄清手中的名称基于本地名称到远程。 (通常它只是"按原样使用本地名称"但是如果您将1234567...设置为origin/master,那么"使用上游" 39;基于我们的合并名称"的本地名称,这有点复杂。)

这意味着在执行push.default(最好是修剪和强制更新)之后,您可以执行upstream在获取期间带来的所有内容,并使用代码驱动的重命名fetch远程分支将所有内容转换为适当的refspec。

尽管如此,实际上还有更好的方法可以解决这个问题。 Git具有镜像存储库的概念,它只是自动同步。镜像存储库是"裸"的一种形式。没有工作树的存储库,因此无法签出。 (这意味着镜像无法在其中完成任何本地工作,使其适合用作镜像。)镜像进一步分为 fetch push 镜像。

获取镜像只是某个遥控器的完美副本。例如,假设您是在大公司和/或某个防火墙后面,并且您希望防火墙一侧的每个人都使用您的某些公共存储库副本。您每30分钟或每天四次更新镜像,或者其他任何内容,然后将内部提取(可能每小时300次)指向防火墙一侧的本地存储库。这可以使您的内部参考保持快速(它们可以保护您的内部网络并位于防火墙后面)并且意味着您不会破坏公共回购。

推送镜像有点类似,但方向相反:您将所有用户推送到推送镜像,然后将推送镜像的内容发送到本地防火墙之外/网络定期。

通常,任何一个存储库只是一种镜像,因为获取和推送不是真正对称的。但是,在这种特殊情况下,你有一个提取镜像推送到push本身应该一个提取镜像(它应该从你的镜像中提取),但由于某种原因设置从镜子里推出来。

请参阅the git remote documentation并特别注意origin/*的{​​{1}} client选项。