裸仓库是什么
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 钩子,先确认脚本可执行
- 在文档里记录仓库地址与访问方式,减少口头传播