Git init 初始化本地仓库
本章节将深入探讨git init 命令。主要包括如下内容
- git init 选项和用法
- .git 目录概览
- 自定义git init目录环境值
- git init 对比 git clone
- git init 空仓库
- git init 模板
git init
命令会创建一个新的 Git 仓库库。它可用于将现有的、未进行版本控制的项目转换为 Git 仓库或初始化一个新的空的仓库。大多数 Git 命令在初始化仓库之外都不可用,所以说这是进行其他操作的基础。如果不是在仓库内进行其他的Git 命令操作,将会出现如下错误。
执行git init会在当前工作目录中创建一个子目录.git
,其中包含新仓库所需的所有 Git 元数据。此元数据包括对象、引用和模板文件等子目录。还会创建一个HEAD
文件,指向当前签出的提交。
下面我们以 /root/workspace/repo 为例,看一下git init 生成的内容
$ cd /root/worksapce/repo
$ git init
Initialized empty Git repository in /root/workspace/repo/.git/
命令执行成功之后,使用tree
命令看一下所有的内容
$ tree
除了.git目录之外,项目的根目录中现有的其他目录或文件保持不变。
与SVN不同,Git不需要在每个子目录中都创建一个
.git
子目录。
默认情况下,git init
会将 Git 配置初始化到.git
子目录中。如果想要将这些配置放到其他地方,可以修改和自定义子目录路径。我们可以将$GIT_DIR
环境变量设置为自定义路径,git init会在执行的时候读取该环境变量,并在那里初始化 Git 配置文件。此外,我们还可以在 git init 命令后面指定参数--separate-git-dir
来设置配置项存放的路径。--separate-git-dir 的优先级要高于设置 $GIT_DIR。
$ git init --separate-git-dir=/root/.git_repo
这时会在 /root/.git_repos 目录下生成所有的配置文件
除了上面示例中我们必须进入项目目录进行初始化之外,还可以在项目目录之外给 git init 命令指定项目目录来进行初始化仓库。
git init <directory>
如果我们已经在一个项目目录上运行
git init
命令并且它包含一个.git子目录,那么我们可以放心地在同一个项目目录上再次运行git init
。它不会覆盖现有.git配置。
git init 与 git clone
快速说明:git init
与 git clone
很容易混淆。它们都可以用于“初始化一个新的 git 仓库”。但是,git clone 依赖于 git init。git clone用于创建现有仓库的副本。在内部,git clone 首先调用 git init以创建新仓库。然后它从现有仓库复制数据,并检出一组新的工作文件。访问git clone 页面了解更多信息。
裸仓库 --- git init --bare
git init --bare <directory>
初始化空的Git仓库,但忽略工作目录。共享仓库应始终使用--bare标志创建。通常,使用--bare
标志初始化的仓库以.git
结尾。例如,名为 repo 的仓库的裸版本应该存储在名为repo.git
的目录中。
--bare
标志会创建一个没有工作目录的仓库,从而无法在该仓库中编辑文件和提交更改。我们可能会创建一个用于git push
和git pull
的裸仓库,但决不会直接在这个裸仓库上进行提交。应始终将中央仓库创建为裸仓库,因为将分支推送到非裸仓库可能会覆盖更改。应该将--bare
认为是一种将仓库标记为存储设施而不是开发环境的方法。这意味着,对于几乎所有的Git工作流,中央仓库是空的,而开发人员的本地仓库是非空的。
git init --bare
最常见的应用场景是创建一个远程中央仓库:
$ git init --bare repo.git
使用--bare
标志创建一个中央仓库。然后,开发人员将克隆 repo.git 从而在他们的开发机器上创建本地副本。
git 初始化模板
git init <directory> --template=<template_directory>
初始化一个新的 Git 仓库并将文件从 <template_directory>
复制 到仓库中。
模板允许我们使用预定义的.git
子目录初始化新仓库。可以将模板配置为具有将被复制到新仓库的.git
子目录的默认目录和文件。默认的 Git 模板通常位于/usr/share/git-core/templates
目录中,但不同机器上可能位于不同的路径中。
默认模板是如何利用模板功能的一个很好的参考和示例。默认模板中展示的模板的一个强大功能是 Git Hook 配置。可以使用预定义的 Git 钩子创建模板,并使用准备就绪的常用钩子初始化新的 git 仓库。
我们会在以后的章节中对 Git Hook 进行介绍。