本章节将深入探讨git init 命令。主要包括如下内容

git init命令会创建一个新的 Git 仓库库。它可用于将现有的、未进行版本控制的项目转换为 Git 仓库或初始化一个新的空的仓库。大多数 Git 命令在初始化仓库之外都不可用,所以说这是进行其他操作的基础。如果不是在仓库内进行其他的Git 命令操作,将会出现如下错误。

git本地应该有几个本地仓库(Git系列)(1)

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本地应该有几个本地仓库(Git系列)(2)

Git-仓库的文件

除了.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本地应该有几个本地仓库(Git系列)(3)

Git-仓库配置文件位置

除了上面示例中我们必须进入项目目录进行初始化之外,还可以在项目目录之外给 git init 命令指定项目目录来进行初始化仓库。

git init <directory>

git本地应该有几个本地仓库(Git系列)(4)

Git-在项目目录之外初始化仓库

如果我们已经在一个项目目录上运行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本地应该有几个本地仓库(Git系列)(5)

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 进行介绍。

,