首页/开发/Git 与协作速查/git init --bare 裸仓库
Git 基础与命令88 条

git init --bare 裸仓库

创建不含工作区的裸仓库,作为团队共享的服务端仓库或迁移中转站;--shared 控制组用户写权限,服务端钩子放在 hooks 目录。

Git 与协作速查开发更新于 2026-10-13

裸仓库是什么

git init --bare 创建的是不含工作区的仓库,目录里只有 .git 的内容(对象库、引用与配置),因此不能在里头直接编辑文件,只用来接收推送、被克隆或被镜像。它是团队共享的服务端仓库和迁移中转站的标准形态:别人 push 上来,你 clone 或 fetch 下去。--shared 用于把仓库共享给一组用户,按 umask 或组权限放行写入。Git 自带协议、SSH 与 HTTP 服务端都基于它。

基本信息

用途创建服务端或中转仓库
区别无工作区,不能直接改文件
常用参数--bare;--shared[=umask] 控制组共享
服务端钩子放在 hooks/ 目录,如 pre-receive
平台Linux 服务器 / macOS / Windows 均可

典型使用场景

  • 在服务器上建团队共享仓库,供成员 clone 与 push
  • 作为迁移中转:从旧平台镜像下来,再推到新平台
  • 内网临时协作,机器上直接用文件路径或 SSH 当远端
  • 挂 pre-receive 钩子做推送校验、权限拦截与自动化
  • 给 CI 机器准备只读克隆源

常用示例

常用示例
git init --bare project.git                    # 创建裸仓库
git init --bare --shared=group project.git     # 同组用户可写
# 本地已有仓库推入裸库
git remote add origin /srv/git/project.git     # 文件路径或 ssh 地址
git push -u origin main                        # 首次推送并建立跟踪
git clone /srv/git/project.git work            # 他人克隆下来开发

仓库形态对比

形态含工作区典型用途
普通仓库有本地开发
裸仓库无服务端接收推送
镜像仓库无迁移与备份,含全部引用
裸仓库可承载服务端钩子(hooks/pre-receive 等),用于推送校验与自动化流程;钩子脚本要放在服务端并保证可执行权限。
git init --bare 是就地新建空库,git clone --bare 则是把已有仓库按裸仓库形态复制一份;后者常用于做服务端副本,注意它不会带你本地未推送的提交。

建库后的收尾步骤

  • 设置默认分支名(如 git symbolic-ref HEAD refs/heads/main)避免首推分支对不上
  • 按团队成员配置组权限或改用 --shared 建库
  • 用 git log 或 git ls-remote 验证远端可读取
  • 需要协作校验时再挂 pre-receive 钩子,先确认脚本可执行
  • 在文档里记录仓库地址与访问方式,减少口头传播

易错点

  • 在裸仓库里执行普通 git 命令会报 this operation must be run in a work tree,别把服务端目录当工作副本改文件
  • 直接复制目录当备份不完整(容易漏掉钩子与权限设置),服务端库备份建议用 git clone --mirror 或 git bundle
  • 把裸仓库的 hooks 当成版本受控文件会踩空:它不在工作区里,改动不会随提交同步,需要额外分发方案
  • 共享仓库没设好组权限时,成员推送会报权限拒绝,建库时就用 --shared 或统一 umask
  • 默认分支名与团队不一致会让首次推送出现两条默认分支,建库时显式指定可以少一次清理

数据来源与参考

  • Git 官方文档:git-init(--bare/--shared)
  • Pro Git 2nd Edition · 4.1 协议
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌