备份GitHub存储库

时间:2009-08-09 16:42:05

标签: git backup

根据以下要求,在GitHub上创建git存储库的本地备份的最佳方法是什么?:

  1. 本地备份应该是一个简单的回购。

  2. 备份应包括所有分支。

  3. 应该很容易(逐步)更新备份。

  4. 基本上,我想要一个完美的镜子,可以轻松更新。因此,命令

    git clone --mirror git://github.com/...
    

    浮现在脑海中,但据我所知,这不允许轻松更新(我必须删除并重新创建本地备份)。另外,git clone的镜像选项看起来很新,我在我正在研究的一些系统上没有它(它有稍微旧版本的git运行)。

    针对此类问题,您推荐的解决方案是什么?

7 个答案:

答案 0 :(得分:43)

我不确定它是否涵盖了您的所有要求,但您可以查看git bundle

git bundle
  

此命令支持git fetchgit pull通过在原始计算机的归档中打包对象和引用,然后使用git fetch和{{1将其导入另一个存储库来操作通过某种方式移动存档后

我喜欢这个解决方案的是生成的单个文件,正是我想要的内容

  

git pull只会打包git-show-ref显示的引用:这包括head,tags和remote head。

git bundle

注意:Kent Fredric在评论中提到git rev-list的精妙内容:

machineA$ git bundle create file.bundle master
  

假设--all 中的所有引用都在命令行中列为$GIT_DIR/refs/

他补充说:

  

您当前的捆绑包只会捆绑提交的父级,您可能需要指定<commit>才能获得所有的完整捆绑包(后代的分支 of master)。

要看到差异:

--all

答案 1 :(得分:42)

创建镜像:

git clone --mirror git://github.com/user/project.git

更新:

cd project.git
git remote update

要更新而不更改当前目录:

git --git-dir project.git remote update

答案 2 :(得分:8)

  
    

但据我所知,这不允许轻松更新(我必须删除并重新创建本地备份)。

  

不确定你的意思,更新它应该像

一样简单
git fetch

git clone因为它应该获取在远程分支上可见的所有引用/提交。

git clone --mirrorgit clone --bare [source]

的差异也不大

唯一相关的区别是缺少git remote add --mirror

(有关不同的行为,请参阅git help add

如果你真的很担心,你可以这样做:

git clone --no-hardlinks --mirror $original $dest 

如果它们在同一个文件系统上,那么它们只会做任何不同的事情。

如果你真的偏执,你可以tar。(gz | bz2)整个目录并返回

答案 3 :(得分:3)

如果您只需要备份GitHub 存储库,您可以查看简单的Bash脚本。

https://github.com/ptrofimov/github-backup-sh

答案 4 :(得分:1)

这可能不是问题本身的确切答案,但绝对是您在编写自己的脚本之前应该考虑的问题。可能的解决方案可能是使用 GitHub Marketplace 中的操作/应用程序备份 GitHub 存储库。市场上有一些可用的选项:https://github.com/marketplace?query=backup

其中一种解决方案可能是使用 Cloudback 创建 GitHub 存储库备份。备份可以在本地下载或保存在最流行的云存储之一中。访问 the Cloudback marketplace 页面或 Cloudback website 了解更多详情。

答案 5 :(得分:0)

在git的约束下,你要问的是很难做到的。问题是默认情况下克隆和提取都不会给你所有的分支。看到这个问题:

有关克隆具有多个分支的repo的示例,这是一个记录:

% git clone -o tufts linux.cs.tufts.edu:/r/ghc/git/experimental.git
Initialized empty Git repository in /usr/local/nr/git/ghc/experimental/.git/
% cd experimental/
% git fetch
% git branch -a
* head
  tufts/HEAD
  tufts/experimental
  tufts/head
  tufts/norman
% git branch --track experimental tufts/experimental
Branch experimental set up to track remote branch refs/remotes/tufts/experimental.
% git branch --track norman tufts/norman
   ...

您可以看到以编程方式克隆每个分支将会有点棘手。

如果github提供对rsync或Unison的访问权限,这些是更好的工具。否则,你将不得不写一些可怕的脚本......

答案 6 :(得分:0)

我在其他人的帮助下写了一篇ruby脚本:

https://github.com/walterjwhite/project.configuration/blob/master/scripts/github.com.backup.ruby

该脚本允许我下载所有存储库。我用它来定期备份我正在处理的项目。

我希望这有帮助,随意调整它。我认为它有一个bug,偶尔,GitHub会超时,脚本也不会处理。