使不同主机上的git存储库保持同步


34

我正在考虑开始一个小项目,我想用git对其进行版本控制。

Bitbucket的免费计划对我来说是一个不错的选择。我想将其用作使用git的主要工具,因为它们具有Web界面,Mac OS客户端等不错的工具。但是,为了更好地保护使用第三方服务可能造成的任何意外损坏,我还想在我的NAS上安装git作为存储库的第二个备份副本。

现在我的问题是,是否可以在两个不同的主机上创建一个存储库,然后使其保持同步?例如,假设我每周更新一次NAS上的存储库,使其与Bitbucket上的存储库匹配。然后,如果Bitbucket发生问题,我仍将在本地NAS存储上拥有完整的存储库以及完整的开发历史记录。

有没有办法将具有完整历史记录的现有存储库导入另一个git-service?


我认为镜像是我所需要的。这似乎正是我需要的描述。而这一个也是如此。

我相信它将复制具有完整历史记录的完整副本,甚至自动将新版本自动提交到两台主机上的存储库中。

我对吗?


我正在使用xpdev,我想知道在您的2系统情况下,在您的情况下,如何提高git的适应性。只是为了确保从每个最终版本中我都进行USB备份。但是从根本上来说,版本控制是在xpdev上处理的,因此并不是真正的要求。顺便说一句,如果您拥有鲁棒的NASS Raid1左右,或者您可以考虑运行自己的版本控制系统,那么也有一些免费版本
user613326 2013年

但是我想在2个地方提供完整的版本控制。如果第三方托管服务商死亡或由公司运营,它消失了,我希望在所有版本控制历史中都拥有完全相同的体验...
BartoNaz 2013年

这意味着我将拥有Bitbucket的舒适性和在NAS上的git以获得99.9%的安全性。
BartoNaz

至于xp-dev,它不太可能死于此类公司,他们可能会更改代码托管计划,价格等。或与另一家公司合并。但对他们来说,这是钱的奶牛。他们还将备份有价值的数据。其业务保持不变。我与3个开发人员一起使用,并且我们的代码存在于5台不同的计算机上,其中始终有一个本地源副本在xp dev上进行同步。如果您只有几个项目,则XP开发人员是免费的。
user613326

1
当然,这不太可能。但是,您永远不能百分百确定……
BartoNaz 2013年

Answers:


19

是的,这正是git之类的DVCS的优点。您可以使用任何数量的不同存储库,其状态与bitbucket或github上的存储库相同。

即使是本地副本(计算机上的存储库)通常也是远程存储库的完整副本。

要使多个存储库保持同步,唯一要做的就是拉一个(通常称为Origin或上游)并推送到备份副本。


11
不幸的是,一切都没有那么闪亮。请参阅KDE近距离灾难警告。也就是说,确保备份确实认为是备份服务器上删除的删除的东西(分公司,仓库等)。
Jan Hudec

我仍然不确定我是否理解正确。据我了解,推和拉适用于特定版本。但是,假设我的工作机上有最新版本的代码。我在远程主机(Bitbucket,Github或其他任何主机)上有git存储库,该存储库具有完整的代码开发历史,直到我在工作计算机上拥有的最新版本(如果已提交)。我在NAS上有一个空的存储库。我可以将代码的完整历史记录从远程主机导入到我的NAS,以便在两个地方拥有两个相同的存储库吗?
BartoNaz

2
克隆远程存储库,然后定期将所有更新(所有分支)拉到该存储库。git clone包含历史记录,它不像只有最新版本的svn checkout。
威伯特

11

这是针对该问题的经过测试的解决方案:自动同步2远程Git存储库

用于同步2个远程Git存储库的简单脚本

我在网上搜索了一个将同步的简单脚本。2个远程存储库,但是即使很多人似乎都在寻找它,我也找不到它!因此,我创建了2个简单的测试存储库,并开始测试和构建此类脚本。

这样的脚本应该做什么?

好吧,通常来说,执行此操作的步骤很简单:1.克隆第一个存储库1.将第二个存储库添加为其他远程存储库1.获取第二个存储库中的所有内容1.将更新的本地存储库推入2远程存储库。

剩下的问题是-以上所有git命令的正确开关是什么?

所以这是...

2 repos-sync.sh gisp脚本

# Clear the folder first - please use this carefully
rm -rf $REPO_NAME  
# clone the reposotory
git clone --bare $ORIGIN_URL

# add a remote repository
cd $REPO_NAME
git remote add --mirror=fetch repo1 $REPO1_URL

# update the local copy from the first repository
git fetch origin --tags

# update the local copy with the second repository
git fetch repo1 --tags

# sync back the 2 repositories
git push origin --all
git push origin --tags
git push repo1 --all
git push repo1 --tags

注意 -此脚本无法解决存储库内容之间发生冲突的情况!


您可能想在回答中提到,您要做的第一件事就是使用$ REPO_NAME删除现有的本地目录。这似乎很重要,并且可以防止仅复制您的解决方案的人丢失数据。
威尔伯特

与此配合,LibGit2对于这种事情很有用。
RubberDuck

0

我使用私有的GitLab来存储我所有的存储库,因此在进行日常开发时,只有一个推入和拉出的来源。

但是,对于开源项目来说,GitHub是一个更加活跃的社区,因此,如果我想接受社区对我的项目的贡献,则可以使用Web GitLab的Web钩子系统来ping我运行的服务器,然后在GitHub上更新我的公共仓库。

这使我可以将GitHub视为别人可以贡献的另一个远程平台-然后我在本地合并-no-ff,并且所有主要存储库和公共存储库都可以分发更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.