Answers:
克隆它怎么办?
git clone --mirror other/repo.git
每个存储库都是其远程服务器的备份。
git branch -a
。也许这样更明显:克隆存储库后,您无需获取每个分支,而是获取每个提交。分支仅引用现有的提交。
git clone
涵盖了所有内容。(1)是可选的,不是必需的。如果结果仍然被优化,它仍然是git本身已经覆盖的备份(2)。-我想说明的一点是,如果git clone
已经涵盖了相关要点,那么您需要其他工具吗?尽管我也更喜欢git bundle
我,但我并不认为我的答案是错误的或无效的。您可以将两种方法都视为热备份与冷备份。
git bundle
我喜欢这种方法,因为它只能生成一个文件,因此更容易复制。
参见ProGit:一点点欢乐。
另请参见“ 如何向某人发送git存储库的电子邮件? ”,其中的命令
git bundle create /tmp/foo-all --all
详细说明:
git bundle
将仅打包git show-ref显示的引用:这包括标题,标签和远程标题。
目的地使用的依据非常重要。
可以谨慎一点,使捆绑文件包含目标中已经存在的对象,因为在目标中解包这些对象时会忽略这些对象,这是可以的。
要使用该捆绑包,您可以克隆它,并指定一个不存在的文件夹(在任何git repo之外):
git clone /tmp/foo-all newFolder
git bundle
是我认为正确的答案,而不是公认的答案。如果他可以问这样的问题,我想他很了解克隆命令,这显然对他来说还不够(因为它是一个克隆,而不是转储)。转储是简单副本的不同事物,例如:1)对于正常工作,它们不需要是最佳的(甚至不是有能力的)2)但是它们必须具有良好的抵抗力和可修复性,以防止数据损坏3)它通常是有用的如果可以轻松地将它们用于增量备份,而对副本而言这不是一个目标。
git bundle
还是git clone
获取所有内容,例如钩子脚本。
git bundle
用于远程仓库吗?
扩展其他答案,这就是我要做的:
设置仓库: git clone --mirror user@server:/url-to-repo.git
然后,当您想刷新备份时:git remote update
从克隆位置。
这会备份所有分支和标记,包括稍后添加的新分支和标记,尽管值得注意的是,被删除的分支不会从克隆中删除(对于备份来说可能是一件好事)。
这是原子的,因此没有简单副本会出现的问题。
扩展KingCrunch和VonC的绝佳答案
我将它们结合在一起:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
之后,您将拥有一个reponame.bundle
可以轻松复制的文件。然后,您可以使用从其中创建一个新的普通git存储库git clone reponame.bundle reponame
。
请注意,git bundle
仅副本提交会在存储库中导致某些引用(分支或标记)。因此,纠结提交不会存储到分发包中。
git bundle create reponame.bundle --all
?
一切都包含在.git
目录中。就像备份任何文件一样,只需将其与项目一起备份即可。
copy
或cp
命令,因此不适合他的需求。而且我还认为,他认为是在裸存储库上(尽管也可以复制它,但我认为它不是功能齐全的备份)。
使用git bundle或克隆
复制git目录不是一个好的解决方案,因为它不是原子的。如果您的大型存储库需要很长时间才能复制,并且有人将其推送到您的存储库,则会影响您的备份。克隆或制作捆绑包不会出现此问题。
您可以使用最小存储大小的git-copy备份git repo 。
git copy /path/to/project /backup/project.repo.backup
然后,您可以使用 git clone
git clone /backup/project.repo.backup project
git clone --bare
+来说,似乎需要做很多工作git push --force
。
IMO的正确答案是git clone --mirror。这将完全备份您的存储库。
Git克隆镜像将克隆整个存储库,注释,标题,参考等,通常用于将整个存储库复制到新的git服务器。这将拉下所有分支以及所有内容,整个存储库。
git clone --mirror git@example.com/your-repo.git
通常,克隆仓库不包括所有分支,仅包括Master。
复制repo文件夹将仅“复制”已拉入的分支...因此默认情况下仅是Master分支或您先前已签出的其他分支。
Git bundle命令也不是您想要的:“ bundle命令会将通常使用git push命令通过网络推送的所有内容打包为一个二进制文件,您可以通过电子邮件将其发送给某人或放入闪存驱动器,然后取消捆绑到另一个存储库中。” (从git clone --mirror和git clone --bare有什么区别)
该线程对于获取一些有关如何执行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
。冷拷贝备份始终可以进行完整的文件备份:拒绝对git repos的所有访问,进行备份并再次允许访问。
由于正在进行的提交会损坏数据,因此无法使用活动仓库进行文件备份。热备份为备份目的提供了活动存储库的固定状态。正在进行的提交不会影响该副本。如上所述,git的克隆和捆绑功能支持此功能,但是对于“ 100%管理员”备份,必须通过其他命令来完成几件事。
git bundle --all
分别创建内容的完整/增量转储文件和复制/备份配置文件。git clone --mirror
,处理和复制配置,然后进行镜像的完整文件备份。
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 repo目录的tar,因为它具有服务器上repo的全部裸内容。进行备份时,可能会有人在做回购。
以下命令将为您提供repo的裸露克隆(就像服务器中一样),然后您可以毫无问题地获取克隆位置的tar。
git clone --bare {your backup local repo} {new location where you want to clone}
据我所知,您只需复制您的存储库所在的目录就可以了!
cp -r project project-backup
git clone --bare
将为您提供一致的快照。