Git推送到refs / remotes / mine / master

时间:2010-09-20 16:40:06

标签: git

我正在跟踪远程存储库,即我有refs/remotes/joe/master

我知道希望尽快将乔的变化送到我的存储库中 我不想使用fetch,因为我提交时可能不会在电脑前。所以我告诉他:我可能会出去购物,所以请将你的更改推到refs/remotes/joe/master 我希望他的变化尽快回到我的回购中的原因是他晚上关掉电脑,所以当我从购物中回来时我无法取得他的变化。

我知道joe应该只设置一个裸的公共存储库,但这有点开销。

在这种情况下,推动refs/remotes/joes/master做一件好事吗?

1 个答案:

答案 0 :(得分:1)

best/simplest way to keep multiple (non-bare) Git repos in sync”建议用更新后的钩子来处理这种贡献。

然而,有一个更直接的解决方案:

作为OP zedoo评论,thread on git push to a non-bare repo(由Git维护者Junio C Hamano编写,早在2007年)详情:
(这是一个很好的例子,适合推向非裸仓库的情况

  
    
      

receive-pack没有更新HEAD reflog作为更新实际分支,而不是HEAD
      如果你推到HEAD,你也应该看到HEAD reflog条目。

    
         

当您推送到底层分支并将HEAD设为非symref时,如何拆分HEAD

  
     

我认为不需要任何复杂功能,我认为有人提到了一个好的例子,这是一个防火墙的主机,只能被推入。   在那个例子中,即使他知道他可以在理想的世界中反向获取,网络配置也不允许他这样做,因此需要推送

     

为了妥善处理这些问题,在非裸存储库之间推送的人可能会忘记推进分支机构

     

相反,他们可以安排他们的推送成为他们希望可以做的>的真实镜像
  举例说明:

     

在只能推送的repo A上,如果你可以从回购B 获取,你会:

$ git fetch B
  

有这样的事情:

[remote "B"] fetch = refs/heads/*:refs/remotes/B/*
  

但不幸的是,因为您只能从A进入B,所以您可以在B上运行此代码:

$ git push A
  

使用:

[remote "A"] push = refs/heads/*:refs/remotes/B/*
  

在您执行推送之后,您带着回购A来到机器上,并记住您所做的是“git fetch B”的镜像 ,你会:

$ git merge remotes/B/master
  

你已经完成了。

     

换句话说,不要将refs/remotes/B视为使用“git fetch”的内容。
  其目的是跟踪远程存储库B的头部
  您可以通过在存储库A中发出提取来维护该层次结构   您也可以在存储库B中发出推送来执行此操作。

     

我几乎每天都进入一个真实的存储库   我的典型日子总结如下:

gitster$ git push kernel-org-private
gitster$ ssh kernel.org
kernel.org$ git merge origin
kernel.org$ Meta/Doit -pedantic &
kernel.org$ exit
... go drink my tea ...
  

,其中

     
      
  1. gitster是我的私人开发机器
  2.   
  3. kernel.org是友好的k.org人员可以使用的机器
  4.   
  5. Meta是我的“todo”分支和
  6. 的结帐   
  7. Doit是一个用于构建所有四个公共分支的脚本。
  8.         

    我总是在我的master存储库中签出'kernel.org',并且我的私人计算机的推送完成(我仍然使用非单独的远程布局):

Push: refs/heads/master:refs/heads/origin
Push: refs/heads/next:refs/heads/next
Push: +refs/heads/pu:refs/heads/pu
Push: refs/heads/maint:refs/heads/maint
  

因此,登录kernel.org计算机后我要做的第一件事就是运行“git merge origin”以使“master”更新。
  如果您认为“push”是“fetch”的镜像,您就会理解为什么。

  这就像在kernel.org机器上发出“git fetch”来检索我的私人机器上的热销,然后“git merge”它(通常是“git pull”会做作为一个   单步)。

     

但是,有时我会不小心将“next”签出   如果我发现我已经退出非“master”,那么在做其他事情之前我会做“git reset --hard HEAD”,而且我不希望我的推动有时会导致分离HEAD有时候没有。
  我不想丢失我最后一个分支的信息(因为接下来我要做的就是找出哪个分支Meta / Doit失败了。)
  如果我 有时会错误地推入实时分支,我会切换到单独的远程布局并推入remotes/origin/*层次结构,并且   在那之后真的没什么可担心的。