是否有一种简单的方法来备份整个git仓库,包括所有分支和标签?
答案 0 :(得分:163)
git bundle
我喜欢这种方法,因为它只会导致一个文件,更容易复制。
见ProGit: little bundle of joy。
另请参阅“How can I email someone a git repository?”,其中包含命令
git bundle create /tmp/foo-all --all
详细说明:
git bundle
只会打包 git show-ref 显示的引用:这包括头部,标签和远程头部。
目的地使用的基础非常重要 可以谨慎行事,导致捆绑文件包含目标中已有的对象,因为在目的地解包时会忽略这些对象。
要使用该捆绑包,您可以克隆它,指定一个不存在的文件夹(在任何git仓库之外):
git clone /tmp/foo-all newFolder
答案 1 :(得分:52)
什么只是克隆它?
git clone --mirror other/repo.git
每个存储库都是其远程数据库的备份。
答案 2 :(得分:20)
扩展其他一些答案,这就是我所做的:
设置回购:git clone --mirror user@server:/url-to-repo.git
然后,当您要从克隆位置刷新备份:git remote update
时。
这会备份所有分支和标记,包括稍后添加的新分支和标记,但值得注意的是,删除的分支不会从克隆中删除(对于备份可能是一件好事)。
这是原子的,因此没有简单副本会出现的问题。
答案 3 :(得分:7)
我将两者结合在一起
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
之后,您将找到一个名为reponame.bundle
的文件,可以轻松地在其中复制。然后,您可以使用git clone reponame.bundle reponame
从中创建一个新的普通git存储库。
请注意,git bundle
仅复制导致在存储库中产生某些引用(分支或标记)的提交。因此,纠结提交不会存储到分发包中。
答案 4 :(得分:4)
所有内容都包含在.git
目录中。只需将其与项目一起备份,就像任何文件一样。
答案 5 :(得分:4)
使用git bundle或clone
复制git目录不是一个好的解决方案,因为它不是原子的。如果您有一个大型存储库需要很长时间才能复制并且有人推送到您的存储库,那么它将影响您的备份。克隆或制作捆绑包不会有这个问题。
答案 6 :(得分:4)
该线程对获取如何完成git repos备份很有帮助。我认为它仍然缺少一些提示,信息或结论来寻找适合自己的“正确方法”(tm)。因此,在这里分享我的想法可以帮助他人,并提出讨论以增强他们的见识。谢谢。
因此,从提起原始问题开始:
然后用典型的愿望丰富它并指定一些预设:
对于什么是“ 100%”备份,观点有所不同。这是两个典型的例子。
git是一个开发人员工具,并通过git clone --mirror
和git bundle --all
支持这一观点。
git gc
)git是一个开发人员工具,将其留给管理员。 git配置和OS配置的备份应与内容备份分开。
其中大多数是备份通用的。
git gc --auto
git bundle --all
git bundle verify
进行验证。 git clone --mirror
git fsck
进行验证。冷拷贝备份始终可以进行完整的文件备份:拒绝 all 对git存储库的访问,进行备份并再次允许访问。
由于正在进行的提交会损坏数据,因此无法使用活动仓库进行文件备份。 热备份为备份目的提供了活动存储库的固定状态。正在进行的提交不会影响该副本。 如上所述,git的克隆和捆绑功能支持此功能,但是对于“ 100%管理员”备份,必须通过其他命令来完成几件事。
git bundle --all
创建内容的完整/增量转储文件并分别复制/备份配置文件。git clone --mirror
,分别处理和复制配置,然后执行镜像的完整文件备份。
答案 7 :(得分:3)
您可以使用git-copy以最小存储空间备份git仓库。
git copy /path/to/project /backup/project.repo.backup
然后,您可以使用git clone
git clone /backup/project.repo.backup project
答案 8 :(得分:2)
正确答案IMO是 git clone --mirror 。这将完全备份您的仓库。
Git克隆镜像将克隆整个存储库,注释,磁头,引用等,通常用于将整个存储库复制到新的git服务器。这将拉下所有分支和一切, 整个 存储库。
git clone --mirror git@example.com/your-repo.git
通常克隆回购并不包括所有分支,只有Master。
复制repo文件夹只会“复制”已经分支的分支 拉入...所以默认情况下只有Master分支或其他 你之前签出过的分店。
Git bundle命令也不是你想要的:“bundle命令 将包装通常被推过的所有东西 将git push命令连接到您可以通过电子邮件发送到的二进制文件中 某人或装上闪存驱动器,然后拆分到另一个存储库。“(来自What's the difference between git clone --mirror and git clone --bare)
答案 9 :(得分:0)
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
这会创建一个备份并进行设置,以便您可以执行git push来更新备份,这可能是您想要做的。只需确保/ path / to / backupdir和/ path / to / repo至少是不同的硬盘驱动器,否则这样做没那么有意义。
答案 10 :(得分:0)
以下是两个选项:
您可以直接获取git repo目录的 tar ,因为它在服务器上拥有repo的全部内容。有人可能会在备份时处理回购。
以下命令将为您提供repo的裸克隆(就像它在服务器中一样),然后您可以获取克隆位置的tar而不会出现任何问题。
git clone --bare {your backup local repo} {new location where you want to clone}
答案 11 :(得分:0)
如果它在Github上,请导航到bitbucket并使用“导入存储库”方法将github存储库导入为私有存储库。
如果它在bitbucket中,请反之。
这是完整备份,但保留在云中是我理想的方法。
答案 12 :(得分:-7)
据我所知,你可以复制你的回购所在的目录,就是这样!
cp -r project project-backup