有没有一种简单的方法来备份包含所有分支和标记的整个 git 回购?
所有内容都包含在 .git目录中。只要将它与您的项目一起备份,就像您将任何文件一样。
.git
git bundle
我喜欢这个方法,因为它的结果只有 一文件,更容易复制左右。 参见 快乐的小宝贝。 另见“ 我怎样才能给某人发送 git 存储库的电子邮件?”,其中的命令
git bundle create /tmp/foo-all --all
详情如下:
git bundle将只包含由 一个 href = “ http://www.kernel.org/pub/software/scm/git/docs/git-show-ref.html”rel = “ noReferrer”> git show-ref 显示的引用: 包括磁头、标签和远程磁头。 目的地所持有的基础是非常重要的。 为了谨慎起见,可以犯一些错误,这会导致 bundle 文件包含目标文件中已经存在的对象,因为在目标文件中解包时会忽略这些对象。
为了使用这个包,您可以克隆它,指定一个不存在的文件夹(在任何 git repo 之外) :
git clone /tmp/foo-all newFolder
据我所知,你只要复制一份你的回购目录,就可以了!
cp -r project project-backup
直接复制一个怎么样?
git clone --mirror other/repo.git
每个存储库都是其远程的备份。
使用 git bundle,或者克隆
复制 git 目录不是一个好的解决方案,因为它不是原子的。如果您有一个很大的存储库,需要很长的时间来复制,并且有人推送到您的存储库,那么它将影响您的备份。克隆或者制造一个包将不会有这个问题。
扩展一些其他的答案,这就是我所做的:
设置回购协议: git clone --mirror user@server:/url-to-repo.git
git clone --mirror user@server:/url-to-repo.git
然后,当您想要从克隆位置刷新备份: git remote update时。
git remote update
这将备份所有分支和标记,包括稍后添加的新分支,但是值得注意的是,被删除的分支不会从克隆中删除(对于备份来说这可能是一件好事)。
这是原子性的,所以不会出现简单拷贝会出现的问题。
参见 http://www.garron.me/en/bits/backup-git-bare-repo.html
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 至少是不同的硬盘驱动器,否则这样做没有多大意义。
您可以在最小存储大小下使用 收到备份 git 回购。
git copy /path/to/project /backup/project.repo.backup
然后您可以用 git clone恢复您的项目
git clone
git clone /backup/project.repo.backup project
这里有两个选择:
您可以直接获取 git repo 目录的 沥青,因为它包含服务器上 repo 的全部内容。有一个轻微的可能性,有人可能正在工作的回购,而采取备份。
下面的命令将为您提供 repo 的完全克隆(就像在服务器中一样) ,然后您可以获取您已经克隆的位置的 tar,没有任何问题。
git clone --bare {your backup local repo} {new location where you want to clone}
正确答案 IMO 是 基特克隆,镜子。这将完全备份您的回购。
Git 克隆镜像将克隆整个存储库、注释、标题、参考文献等,通常用于将整个存储库复制到新的 Git 服务器。这将下拉一个所有的分支和所有的东西,即 整个存储库。
git clone --mirror git@example.com/your-repo.git
正常情况下,克隆一个回购并不包括所有的分支,只包括 Master。
复制回购文件夹只会“复制”已经存在的分支 拉进来... 所以默认情况下,这是主分支或其他 您以前已经签出的分支机构
Git bundle 命令也不是您想要的: “ The bundle command 将包装一切,通常会推到 使用 git push 命令连接到一个二进制文件,您可以通过电子邮件发送到该文件 某人或者放在一个闪存驱动器上,然后将其解包到另一个存储库中。”
用 金康脆和 VonC拓展大答案
我把两者结合起来:
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 存储库。
reponame.bundle
git clone reponame.bundle reponame
请注意,git bundle只复制导致存储库中某些引用(分支或标记)的提交。因此,纠缠提交不存储到捆绑包中。
如果是在 Github 上,导航到 bitbucket 并使用“导入存储库”方法将您的 Github 回购作为私有回购导入。
如果是在 bitbucket 里,反过来做。
这是一个完整的备份,但保留在云中,这是我的理想方法。
这个帖子对于了解如何备份 git 回购非常有帮助。我认为它仍然缺乏一些提示,信息或结论,以找到“正确的方式”(tm)为自己。因此,在这里分享我的想法,以帮助他人,并把他们的讨论,以加强他们。谢谢。
所以从回答最初的问题开始:
然后用典型的愿望来丰富它,并指定一些预设:
关于什么是“100%”备份,观点不同。
Git 是一个开发工具,通过 git clone --mirror和 git bundle --all支持这种观点。
git clone --mirror
git bundle --all
git gc
Git 是一个开发人员工具,并将其留给管理员。 Git 配置和 OS 配置的备份应该与内容的备份分开。
它们中的大多数都是用于备份的通用工具。
git gc --auto
git bundle verify
git fsck
一个冷拷贝备份总是可以做一个完整的文件备份: 拒绝 所有访问 git 回购协议,做备份并允许再次访问。
由于正在提交的数据存在损坏的风险,无法使用活动回购进行文件备份。 热拷贝为备份目的提供活动存储库的固定状态。正在进行的提交不影响该拷贝。 如上所述,git 的克隆和捆绑功能支持这一点,但是对于“100% 管理”备份,有几件事情必须通过附加命令来完成。
中有一个非常简单的 Python 工具,可以自动备份组织的存储库。通过保存公共和私有存储库及其所有分支来实现 zip 格式。它与 Github API: https://github.com/BuyWithCrypto/OneGitBackup一起工作