无需推送即可跨机器同步Git存储库

时间:2009-11-14 14:40:56

标签: git synchronization

我有三台计算机,它们的所有应用程序应该具有相同的设置。由于他们都使用这些设置运行进程,因此我从不想要推送,而是我希望他们每个人都跟踪其他两个,并且只在我登录时才拉。 / p>

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

编辑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 个答案:

答案 0 :(得分:3)

你可以拉。即你在机器A上有一些新的提交,现在你在机器B上,然后你就从A中拉出来,比如

git pull A

git pull文档包含许多有用的示例和用法,包括使用remotes

答案 1 :(得分:3)

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

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

为了做到这一点,您必须直接使用git fetch命令,而不是通过pull。更具体地说,你会想要做这样的事情:

git fetch A
git rebase A/master

将“A/master”替换为您在本地跟踪的远程分支的名称。您的本地存储库中的任何更改都将在A/master的头部进行重新分配,为您提供线性历史记录,而不是仅仅稍微分歧以便稍后合并一些提交的历史记录。