备份一个GitHub仓库

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

  1. 本地备份应该是裸露的回购。

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

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

基本上,我想要一个完美的镜子,有可能更新容易。 就这样,命令

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

想到,但据我所知,这并不容易更新(我不得不删除并重新创build我的本地备份)。 另外,git clone的镜像选项看起来挺新的,我没有在我正在使用的一些系统上(它有一些运行的旧版本的git)。

你对这类问题推荐的解决scheme是什么?

创build镜像:

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

更新:

 cd project.git git remote update 

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

 git --git-dir project.git remote update 

我不知道它可以涵盖所有的要求,但你可以检查出的Git包

 git bundle 

这个命令提供了对git fetchgit pull支持,通过在源机器的归档文件中打包对象和引用,然后使用git fetchgit pull将这些文件导入到另一个仓库中

我喜欢的解决scheme是生成的单个文件,正是我想要的

git bundle将只打包由git-show-ref显示的引用:这包括头部,标记和远程头部。

 machineA$ git bundle create file.bundle master 

注意: Kent Fredric在评论中提到了git rev-list一个微妙之处:

 --all 

假设$GIT_DIR/refs/中的所有引用都作为<commit>在命令行中列出。

他补充说:

你的当前包只会捆绑提交的父母,你可能需要指定 – --all来获得一切的完整的包(主后裔的分支)。

要看到不同之处:

 $ git bundle create /tmp/foo master $ git bundle create /tmp/foo-all --all $ git bundle list-heads /tmp/foo $ git bundle list-heads /tmp/foo-all 

但据我所知,这并不容易更新(我不得不删除并重新创build我的本地备份)。

不知道你是什么意思,更新它应该是如此简单

 git fetch 

git clone因为它应该是获取远程分支上可见的所有参考/提交。

git clone --mirrorgit clone --mirror是很不一样git clone --bare [source]

唯一不同的是git remote add --mirror

(请参阅git help add不同的行为)

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

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

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

如果你确实是偏执的话,你可以把整个目录tar(.gz | bz2),然后把它保存起来。

如果你只需要备份GitHub仓库,你可以看看简单的Bash脚本。

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

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

  • 如何一次更新所有分支 ?

有关使用多个分支机构复制回购的示例,请参阅以下副本:

 % 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的访问,这些是更好的工具。 否则,你将不得不写一些可怕的脚本…

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

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

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

我希望这有帮助,随时调整它。 我认为它有一个错误,偶尔,GitHub会超时,脚本无法处理。