通常我们会使用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更新。
因此,在裸仓库上不会存在直接的提交变更等操作,但裸仓库可以正常的被clonepush

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