代码之家  ›  专栏  ›  技术社区  ›  l0b0

在不推送的情况下跨计算机同步git repos

  •  3
  • l0b0  · 技术社区  · 15 年前

    我有三台计算机,它们的所有应用程序都应该具有相同的设置。因为它们都有使用这些设置运行的进程,所以我 从未 想要推,相反,我想让他们每个人都跟踪另外两个,只有当我登录时才拉。

    在这方面工作了几天之后,我发现的所有文章似乎都假定您希望在从其他机器上提取之前将其推送到中央存储库,但这似乎是在浪费空间和(传输)时间。有没有什么指南可以清楚地解释如何做这样的事情?

    编辑2:pat notz给出了更正的必要提示。git/config:

    [branch "master"]
      remote = machine2
      merge = refs/heads/master
    [remote "machine1"]
      url = ssh://192.168.0.4/~/settings
      fetch = +refs/heads/*:refs/remotes/machine1/*
    [remote "machine2"]
      url = ssh://machine2/~/settings
      fetch = +refs/heads/*:refs/remotes/machine2/*
    

    编辑3:非常感谢你的回答。结果可以在单独的 blog post .

    2 回复  |  直到 15 年前
        1
  •  3
  •   Daniel Spiewak    15 年前

    如上所述, git pull 是一个很好的答案。这个 pull 命令本质上是 fetch merge ;前者将把所有远程提交作为(可能是新的)分支带到您的存储库中,而后者将把该分支合并到您的当前分支中。当然,确定哪个分支将获得合并是一个小技巧。通常,您必须在每个存储库的基础上配置它。当当前签出的分支跟踪从中提取的存储库中的远程分支时,Git确实有一个特殊情况,并且该远程分支是 只有 其中一个具有更改,此时Git将简单地假设您希望将远程分支与当前分支合并并自动执行。

    除了一些相当不透明的配置, 还有一些其他的问题值得一提。最值得注意的是:它与 合并 命令。换句话说,如果拉入远程更改,并且在本地分支中有一些自己的更改,那么为了统一这两个分支,Git将被迫执行合并。原则上,这是很好的,但它会破坏你在未来某个时候想要做的任何再平衡。您提到您的用例是您自己的三台计算机。如果我是你,我会尽量把我的历史保持在同一个分支上,跨越三条直线。不合并计算机 进入机器 ,重新调整 在变化的基础上 在那个逻辑分支上产生一个单一的线性历史。

    要做到这一点,您必须使用 git fetch 直接指挥,而不是通过 . 更具体地说,您需要这样做:

    git fetch A
    git rebase A/master
    

    替换“ A/master “使用您正在本地跟踪的远程分支的名称。本地存储库中的任何更改都将在 A/硕士 ,为您提供一个线性历史记录,而不是一个短暂分离的历史记录,只是在稍后合并一些提交。

        2
  •  3
  •   Pat Notz    15 年前

    你可以拉。也就是说,你在机器A上有了一些新的承诺,现在你在机器B上了,然后你就从A上拉了下来,就像

    git pull A
    

    这个 git pull 文档有很多有用的示例和用法,包括 remotes .