最可靠方式是用git clone --bare或git bundle create --all:前者适合长期归档,后者适合离线迁移;二者均完整包含所有分支、tag及引用,而直接复制.git或整个目录易漏reflog、notes等且无法校验完整性。
直接备份本地 Git 仓库,最可靠的方式不是复制整个项目文件夹,而是用或—— 前者适合长期归档,后者适合离线迁移或临时打包。
用
创建裸仓库备份
裸仓库不含工作目录,只保留 Git 元数据(
内容),体积小、结构干净、可直接作为远程源使用。
必须在**目标备份路径外**执行,例如:
如果原仓库有未提交的修改(即工作区脏),这些内容不会被包含——
只克隆已提交历史
恢复时用
即可获得完整可操作仓库,含所有分支和 tag
不建议用
替代:它漏掉 reflog、notes、replace refs 等隐式引用,且无法校验完整性
用
打包成单文件
适合跨网络受限环境(如内网机器导出)、U 盘携带、或需要原子性备份的场景,但它是“快照”而非“镜像”,行为更脆弱。
必须加
,否则默认只打包
分支:
若仓库含
或自定义 ref(如
),需显式列出:
打包前运行
能减小 bundle 体积,避免冗余对象膨胀
验证 bundle 是否可用,不能只看文件是否存在,要立刻执行:
+
为什么不用
或直接拷贝
目录
看似最简单,实则最容易出问题:
Git
程序猿必备版本控制工具
下载
整个项目目录会把未跟踪文件、构建产物、临时文件一并复制,体积大且不可控
只拷贝
目录会丢失
状态、reflog、以及某些 Git 2.35 之前版本中因锁文件未释放导致的损坏风险
Windows 上路径含空格或 Unicode 时,部分旧版 Git 对
目录的硬链接/符号链接处理异常,恢复后
可能报错
没有校验机制:损坏的
目录可能直到执行
或
才暴露问题
恢复时常见错误与对应命令
bundle 恢复不是“解压即用”,clone 也不是“点开就行”,关键在 ref 的显式指定:
误用
→ 默认只取
,其他分支、tag 全丢;应改用
(自动拉取全部)
误用
→ 只拉一个分支;想全量恢复,进空目录后执行:
裸仓库恢复后发现缺少某些 tag?检查原仓库是否用了
但没推送到 origin ——
克隆会包含所有本地 tag,但
需确认
是否生效
恢复后
显示 commit 少一截?大概率是原仓库存在孤立提交(orphan commit)且无任何 ref 指向它——这类提交本就不在常规遍历路径中,
和
都不会主动打包
真正容易被忽略的是:无论用哪种方式,备份后必须立刻验证可恢复性。跑一次
或
成功,比看文件大小或存在性可靠得多。Git 不会在备份时做预校验,损坏往往在半年后第一次恢复时才暴露。
git clone --baregit bundle create --allgit clone --bare.gitgit clone --bare /path/to/your/repo /backup/repo.git--baregit clone /backup/repo.gitcp -r .git /backup/git bundle create--allHEADgit bundle create repo.bundle --allrefs/notes/refs/pull/git bundle create repo.bundle --all refs/notes/**git gcgit bundle verify repo.bundlegit ls-remote repo.bundlecp -r.gitcp -r.gitindex.gitgit status.gitgit loggit fsckgit clone repo.bundleHEADgit clone repo.bundle my-repogit pull repo.bundle maingit init && git pull ../repo.bundle --allgit tag -a--baregit bundle--allgit loggit bundle--baregit clonegit pull --all