代码之家  ›  专栏  ›  技术社区  ›  detly FBruynbroeck

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

git
  •  3
  • detly FBruynbroeck  · 技术社区  · 14 年前

    我的工作流程基本上是:

    • 在我的台式电脑上创建回购
    • 对它做一些工作并提交更改
    • 复制到我的笔记本上
    • 为此工作,提交更改

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

    1. 在我的电脑的另一个目录中创建第三个裸机存储库,并从中更新两个工作副本。但是一个包含两个已签出工作副本的中央存储库听起来像…斯文!除了更笨拙,因为我不能只用 svn update svn commit 要与这个中央存储库同步,需要额外的步骤来实际更新中央回购,使其从提交给Git工作副本的更改中更新。

    2. 推到单独的分支并将该分支合并到我的桌面工作副本中。这还不错,但是……

    …我不明白的是:如果我只是通过ssh连接到台式电脑上 git pull laptop.local:~/my-repo ,它起作用了!它将提交的更改拉入并更新签出的主分支,不询问任何问题。为什么不能 git push 自己做吗?

    所以我的问题是:是否有一个命令与 ssh -进入我的台式电脑并发出 pull ?

    2 回复  |  直到 14 年前
        1
  •  2
  •   mb14    14 年前

    问题是当你试图推动你同时做两个动作时。 第一个是更新git树,第二个是更新笔记本电脑上的工作目录。所以在推送过程中有一种隐式的“签出”,Git拒绝这样做,这是正确的。 想象一下如果有人在你的台式电脑上工作会发生什么。 当你做一个ssh的事情是不同的,你在你的工作目录,你负责你所做的一切,所以,你可以做任何你想做的,删除文件,“拉”。所以,在某种程度上,推不允许(默认情况下)弄乱远程计算机,这似乎是正常的。

    更新

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

    如果您真的只想运行一个命令,请使用shell的强大功能并创建一个别名,该别名可以从桌面计算机上执行git pull操作。

    alias remote_pull=ssh <desktop> "cd <path>; git pull"
    
        2
  •  2
  •   czchen    14 年前

    你可以设定 receive.denyCurrentBranch 警告允许推到桌面PC。但是,这是危险的。如果桌面PC中有一些提交,则此推送将导致混淆。

    以下是手册 接收.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".