我真的不想在git上签出代码,因为我不会使用它。我只想成为两个遥控器之间的接力。并且,让它们保持同步。有没有办法在git中这样做?
喜欢某种形式:
git push client
我从文档中读到最后一个参数必须是本地分支。我不能签出本地副本,因为我不会以任何方式处理它。
总而言之,我只想运行一个:
git fetch origin
然后a:
git push client origin / *(等效)
将原始提交的所有代码推送到(另一个远程调用的)客户端。
答案 0 :(得分:1)
是的,你可以这样做,因为git push
只需要你(本地)端的提交标识符和远端的分支名称。在路上只有一件事。
来自git fetch
的{{1}}后,您在origin
进行了本地提交,通过名称origin
找到。尽管名称如origin/*
和origin/master
,但这些是您的资源库中的名称 (他们只是跟踪"分支在{{1}上的位置我们最后一次同步origin/branch
)。将origin
推送到origin
的方法之一就是这个名字origin/master
。
refspec 的完整语法(在client
或origin/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
选项。