根据以下要求,在GitHub上创建git存储库的本地备份的最佳方法是什么?:
本地备份应该是一个简单的回购。
备份应包括所有分支。
应该很容易(逐步)更新备份。
基本上,我想要一个完美的镜子,可以轻松更新。因此,命令
git clone --mirror git://github.com/...
浮现在脑海中,但据我所知,这不允许轻松更新(我必须删除并重新创建本地备份)。另外,git clone的镜像选项看起来很新,我在我正在研究的一些系统上没有它(它有稍微旧版本的git运行)。
针对此类问题,您推荐的解决方案是什么?
答案 0 :(得分:43)
我不确定它是否涵盖了您的所有要求,但您可以查看git bundle
git bundle
此命令支持
git fetch
和git 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 --mirror
与git clone --bare
[source]
唯一相关的区别是缺少git remote add --mirror
(有关不同的行为,请参阅git help add
)
如果你真的很担心,你可以这样做:
git clone --no-hardlinks --mirror $original $dest
如果它们在同一个文件系统上,那么它们只会做任何不同的事情。
如果你真的偏执,你可以tar。(gz | bz2)整个目录并返回 。
答案 3 :(得分:3)
如果您只需要备份GitHub 存储库,您可以查看简单的Bash脚本。
答案 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会超时,脚本也不会处理。