git - 在没有推送的情况下跨机器同步 Git repos

标签 git synchronization

我有三台计算机,它们的所有应用程序都应该具有相同的设置。因为它们都有使用这些设置运行的进程,所以我从不想要推送,相反我希望它们中的每一个都跟踪另外两个,并且只在我登录时 pull 。

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

编辑 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 中找到.

最佳答案

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

除了一些相当不透明的配置外,pull 还有一些其他问题值得一提。最值得注意的是:它与 merge 命令相关联。换句话说,如果你 pull 入远程更改,而你在本地分支中有一些自己的更改,Git 将强制执行 merge 以统一两个分支。原则上,这很好,但它会对您将来可能想要进行的任何重新设置造成严重破坏。您提到您的用例是您自己的三台计算机。如果我是你,我会尽量让我的历史记录在三个分支中尽可能线性。不要将机器 A merge 到机器 B,在 A 的更改之上重新设置 B 的更改在该逻辑分支上生成单一的线性历史记录。

为此,您必须直接使用 git fetch 命令,而不是通过 pull 进行操作。更具体地说,您需要执行以下操作:

git fetch A
git rebase A/master

将“A/master”替换为您在本地跟踪的远程分支的名称。本地存储库中的任何更改都将在 A/master 的头部重新设置父级,从而为您提供线性历史记录,而不是仅在稍后 merge 几个提交的短暂分歧。

关于git - 在没有推送的情况下跨机器同步 Git repos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1734405/

相关文章:

java - Scala/Java 中的等价锁?

database - Google Gears - 同步支持到什么级别?

git - 运行 BFG Repo Cleaner 后如何更新/缩小我的 github 存储库的大小

git - 在没有文件 check out 的情况下切换 Git 分支

Android AsyncTask 同步

c - Openmp在并行内同步

git - 在不同的计算机上通过 git 同步工作

linux - 定期将 bash 历史推送到 github

git - 转到上一个提交,进行更改并作为新头提交

ios - iOS 10 中的本地存储和同步