2010-07-26 101 views
42

我是一名独立开发人员,在本地Git存储库中工作。对于备份,我想将该存储库的确切副本发送到另一台服务器。“git push --mirror”足以备份我的存储库吗?

这样做足够吗?

git push --mirror 

我这么问是因为我有时可以运行此命令两次或三次Git的告诉我:“一切了最新的”过,所以很明显它不是一个确切的镜子。这似乎是重新推动追踪分行......?

$ git push --mirror 
Counting objects: 42, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (30/30), done. 
Writing objects: 100% (30/30), 5.09 KiB, done. 
Total 30 (delta 17), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 mybranch -> mybranch 
$ git push --mirror 
Total 0 (delta 0), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 origin/mybranch -> origin/mybranch 
$ git push --mirror 
Everything up-to-date 

发生了什么,这是一个很好的策略吗?

编辑:我不喜欢使用类似git bundle.tar.bz2档案,因为我希望备份是一个可访问的工作副本。由于我的备份服务器连接到网络并始终打开,因此在路上时,这是访问存储库的好方法。

+2

参见:[备份本地Git仓库(http://stackoverflow.com/questions/2129214/backup-a-local-git-repository) – miku 2010-07-26 08:24:24

+0

这是否备份引用日志以及?如果没有,那么这是一个很差的备份。 – onionjake 2014-04-07 21:52:21

回答

6

我会说这是一个完全可以接受的备份策略。它应该对存储库中的每个参考文件执行一次远程启动。使其成为本地存储库的完整“镜像”。

编辑:我刚刚看到你的更新说明的问题。看起来git正在将您的远程引用与其他所有内容一起推送到远程本身。一旦完成推送,远程参考将被更新,以反映你刚刚推送到它。现在这将与远程存储库过时,因此需要进一步推进。如果这不能让你满意。你可以用

混帐推删除远程参考:产地/ mybranch

然后用

混帐推--all

记得这韩元” t推动你创建的任何新分支。

+0

那么为什么当我第二次运行它时会做些什么? – Thomas 2010-07-26 11:28:28

+0

你是什么意思的'东西'?您正在推送到裸露克隆的存储库?你可以提供更多的细节,因为我确定git push --mirror应该提供你正在寻找的功能。 – 2010-07-26 18:23:21

+5

另外值得一提的是使用--mirror选项克隆存储库,然后使用'git remote add --mirror '。这将自动镜像,所以你应该能够运行'git push'。 – 2010-07-26 18:32:22

0

为什么不直接压缩.git文件夹的副本并将其发送到另一台服务器?

+0

看我的编辑。 :) – Thomas 2010-07-26 09:04:26

3

我通常使用git push --all。当我需要推新创建的分支时,我只使用--mirror,或者我删除了一些分支,并且不想一个一个地命名它们。否则,push --all通常会按需要工作。

28

你第二次看到某些东西的原因是--mirror推得比你想象的要多一点。除了您当地的分支机构之外,它还会推动您的远程分支机构,因为镜像暗示的一切都是。因此,当您正常推送(或使用--mirror)时,会推送mybranch,并更新origin/mybranch以反映原始状态的新状态。当你推--mirror时,origin/mybranch也被推。

这会导致您看到的陌生感,并且在您从遥控器拉出时会产生更糟糕的陌生感;你会得到名称为origin/origin/mybranch等的分支。因此,通常最好使用--mirror一次性副本,并且只需使用正常推送(可能与--all)即可正常使用。

要始终推动所有分支和标签,你可以像这样更新.git/config

[remote "origin"] 
    url = ... 
    fetch = ... 
    push = +refs/heads/* 
    push = +refs/tags/* 

这将使类似镜子的正常推进,但它不会删除不存在的分支在源或非快进更新。

+0

谢谢,很高兴知道。我记得在某个时候看过这些'origin/origin/*'分支,但显然我删除了它们。 '--all'的问题是它不会推送任何新的分支,也不会删除任何删除的分支。这不足以防万无一失,有时候我可以成为一个傻瓜。没有办法告诉'--mirror'忽略远程分支? – Thomas 2010-07-27 11:20:37

+0

我不认为有办法让它忽略遥控器。但是,您可以修改'.git/config'以按默认值推送更多内容。我已经更新了答案。 – 2010-07-27 12:09:06

19

不幸的是,你没有得到与推的确切副本。你lose your stash

+3

谢谢,很高兴知道。然而,这并不重要,因为无论如何这个藏匿处应该是一个非常短暂的事情。 – Thomas 2010-07-27 11:15:24

+2

是的,我认为它足够备份,但不适合同步。 另外,我们都知道我们有时候依赖短期的东西多久。 ;) – nschum 2010-07-27 18:36:32

+4

如果你保留任意时间的存储空间,也许你需要更舒适的制作分支(: – Jacob 2012-04-23 00:20:17

3

我要做的就是:

设置回购:​​

然后,当你想刷新备份:从克隆位置git remote update

这将备份所有分支,包括后来添加的新分支,但值得注意的是,删除的分支不会从克隆中删除(对于备份而言,这可能是件好事)。

http://www.garron.me/en/bits/backup-git-bare-repo.html