备份GitHub存储库

Mic*_*erz 56 git backup

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

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

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

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

基本上,我想要一个完美的镜子,可以轻松更新.就这样,命令

git clone --mirror git://github.com/...
Run Code Online (Sandbox Code Playgroud)

想到了,但据我所知,这不允许轻松更新(我必须删除并重新创建我的本地备份).另外,git clone的镜像选项似乎是最近的,我没有在我正在研究的一些系统上(它有稍微旧版本的git运行).

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

Von*_*onC 46

我不确定它是否可以满足您的所有要求,但您可以查看git包

git bundle
Run Code Online (Sandbox Code Playgroud)

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

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

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

machineA$ git bundle create file.bundle master
Run Code Online (Sandbox Code Playgroud)

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

--all
Run Code Online (Sandbox Code Playgroud)

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

他补充说:

您当前的捆绑包只会捆绑提交的父级,您可能需要指定--all获取所有内容的完整捆绑(分支是master的后代).

要看到差异:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • nb:你当前的bundle只会绑定提交的父级,你可能需要指定--all来获取*everything*(作为master的后代的分支)的完整包.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.小,但重要. (4认同)
  • 我尝试了所有这些,但从来没有分支保存在捆绑中. (2认同)
  • 另请参阅:[从捆绑备份中恢复 git 存储库](http://stackoverflow.com/q/9807367/562769) (2认同)

Fer*_*eia 44

要创建镜像:

git clone --mirror git://github.com/user/project.git
Run Code Online (Sandbox Code Playgroud)

更新:

cd project.git
git remote update
Run Code Online (Sandbox Code Playgroud)

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

git --git-dir project.git remote update
Run Code Online (Sandbox Code Playgroud)

  • 此过程是获取远程仓库的完整本地副本的正确方法; 然后可以与`git bundle create --all`一起使用,将整个仓库导出为单个文件. (5认同)

Ken*_*ric 9

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

不确定你是什么意思,更新它应该很简单

git fetch
Run Code Online (Sandbox Code Playgroud)

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

git clone --mirror[来源]也没有太大区别git clone --bare

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

(参见git help add不同的行为)

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

git clone --no-hardlinks --mirror $original $dest 
Run Code Online (Sandbox Code Playgroud)

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

如果你是真的偏执,你可以焦油.(GZ | BZ2)整个目录和背部了.