通常我们会使用git init
来初始化Git本地仓库。
基本用法
- 将当前目录转换为一个本地仓库
git init
命令执行之后在本地生成一个.git
文件夹,用来追踪仓库所有的变更。
可以使用tree
命令打印目录结构。
- 创建一个空的本地仓库
git init <repo>
命令执行之后,会在当前目录下生成一个新的名为<repo>
的目录,里面只有.git
目录。
裸仓库
- 指定某个目录成为中心仓库(裸仓库)
git init --bare <repo>
这个命令执行之后,在本地会创建一个名为repo的目录,里面包含着Git的基本目录,这里一般的命名会写成repo.git
的形式,对于--bare
这个参数的含义,是生成的裸仓库,不包含工作区,所以不能在这个目录下面使用一般的Git命令。
对比
对比使用传统的git init
和使用加参数的--bare
的区别。比较两个仓库的config文件:
- git init
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true
- 加参数的
[core] repositoryformatversion = 0 filemode = true bare = true ignorecase = true precomposeunicode = true
最明显的差异在于使用bare
配置项是否为true
,此外不加--bare
参数的本地仓库配置中有一项logallrefupdates = true
,即记录所有的ref更新。
因此,在裸仓库上不会存在直接的提交变更等操作,但裸仓库可以正常的被clone
和push
。
Github上的用法
裸仓库可以用来复制仓库。
因为通过fork
来的仓库会受到一些限制,比如不能设置为私人仓库等,如果没有向原仓库pull request
的需求的话,可以选择创造一个仓库的镜像到自己的Github上。
首先要在自己的Github上创建一个新的repo,然后在本地clone一个裸仓库。
git clone --bare <address>
然后使用mirror-push
:
cd old-repo.git
git push --mirror <your new repo address on github>
最后删除位于本地的裸仓库即可:
cd ..
rm -rf old-repo.git