Git - 将存储库与签出分支同步的最简单方法

时间:2010-10-25 00:01:20

标签: git

我的工作流程基本上是:

  • 在我的台式电脑上创建一个仓库
  • 做一些工作并提交更改
  • 克隆到我的笔记本电脑上
  • 处理,提交更改

现在我想将更改与桌面同步。尝试git push desktop.local:~/my-repo会失败,因为the master branch is already checked out。我知道有两个解决方案:

  1. 在我的电脑上的另一个目录中创建第三个裸存储库,并从那里更新两个工作副本。但是单个中央存储库检查出两个工作副本听起来像...... SVN!笨拙的,因为我不能只使用svn updatesvn commit来与这个中央存储库同步 - 需要额外的步骤来实际更新中央存储库中提交给Git中工作副本的更改。

  2. 推送到单独的分支,并将该分支合并到我的桌面工作副本中。这不是太糟糕,但是......

  3. ...我不明白的是:如果我只是通过SSH连接桌面PC并发出git pull laptop.local:~/my-repo,它就可以了!它提取已提交的更改并更新已签出的主分支,无需提问。为什么git push不能自己做这个?

    所以这是我的问题:是否有一个与ssh相同的命令 - 进入我的桌面PC并发出pull

2 个答案:

答案 0 :(得分:2)

您可以将receive.denyCurrentBranch设置为警告以允许推送到您的台式PC。但是,这很危险。如果桌面PC中有一些提交,这种推送会引起混淆。

以下是receive.denyCurrentBranch的手册供您参考。

  receive.denyCurrentBranch
      If set to true or "refuse", receive-pack will deny a ref update to
      the currently checked out branch of a non-bare repository. Such a
      push is potentially dangerous because it brings the HEAD out of
      sync with the index and working tree. If set to "warn", print a
      warning of such a push to stderr, but allow the push to proceed. If
      set to false or "ignore", allow such pushes with no message.
      Defaults to "refuse".

答案 1 :(得分:2)

问题是当你试图推动你同时做两个动作时。 第一个是更新git树,第二个是更新笔记本电脑上的工作目录。所以在推送过程中有一种隐含的“结账”,git拒绝这样做,这是对的。 想象一下如果某人真的在您的台式PC上工作会发生什么。 当您执行SSH时,事情就不同了,您在工作目录中,您负责所做的一切,因此,可以执行您想要的任务,删除文件,“拉动”。所以在某种程度上看似正常,推送不允许你(默认情况下)弄乱远程计算机。

更新

如果要将receive.denyCurrentBranch设置为忽略,则可以推送但仍需要将工作目录与代码的“最新”版本(刚刚推送的那个)“同步”。这意味着你仍然有2个命令在每台计算机上运行一个

如果你真的只想运行一个命令,请使用shell的强大功能并创建一个别名,从桌面计算机执行git pull

alias remote_pull=ssh <desktop> "cd <path>; git pull"