【Git】initコマンドについて

# initコマンドとは

`init`コマンドは新しいGitリポジトリを作成するために使用します。リポジトリは「ファイルやディレクトリの状態を管理する場所」のことを指します。一連のGitのコマンドはリポジトリが管理しているディレクトリ内で使用することができます。

実際に`init`コマンドを実行してみると現在のディレクトリに**.git**ディレクトリが作成されます。基本的には.gitディレクトリがリポジトリとなります。

`git init`の処理を各コマンドの出力から確認してみましょう。今回リポジトリを作成するディレクトリの名前は**git_dir**とします。

```bash:initコマンド
# 現在のディレクトリ
$ pwd
/home/hogehoge/git_dir

#git_dirが空であることを確認
$ ls -a
./  ../

$ git init
Initialized empty Git repository in /home/hogehoge/git_dir/.git/

# .gitディレクトリが作成されていることを確認
$ ls -a
./  ../  .git/
```

`git init`によってgit_dirディレクトリに.gitディレクトリ(=リポジトリ)が作成されます。リポジトリが作成されることで、gitコマンドでgit_dirディレクトリを管理できるようになります。このようにgitを使えるように準便を整えるためのコマンドがinitコマンドです。

# オプション

## 基本オプション

### -q / --quiet

コマンド実行時に表示されるメッセージを省略します。ただし、errorメッセージとwarningメッセージは表示されます。

```bash
$ git init
Initialized empty Git repository in /home/hogehoge/git_dir/.git/

# 作成時のメッセージが表示されない
$ git init -q

```

### --bare
**ベアリポジトリ**と呼ばれる特殊なGitリポジトリを作成します。bareとは日本語で「裸の」という意味があります。ベアリポジトリには、実際のプログラムやディレクトリはありませんが**.gitの中にあったファイル**だけ持っています。ベアリポジトリはpush先となる集約されるようなリポジトリに対して作成します。ベアリポジトリでないリポジトリは**ノンベアリポジトリ**と呼びます。`--bare`を使用することで、対象のディレクトリを.gitディレクトリそのものとして扱います。

#### ベアリポジトリの特徴

- 作業用ディレクトリを持たない
- 管理用ディレクトリ(リポジトリ)のみ持つ

```bash:ノンベアリポジトリの作成
$ git init
Initialized empty Git repository in /home/hogehoge/git_dir/

$ ls -a
./  ../  .git/

$ ls .git/
config  description  HEAD  hooks/  info/  objects/  refs/
```

```bash:ベアリポジトリの作成
$ git init --bare
Initialized empty Git repository in /home/hogehoge/git_dir/

$ ls
config  description  HEAD  hooks/  info/  objects/  refs/
```

ノンベアリポジトリでは現在のディレクトリに**.gitディレクトリ**が作成されますが、ベアリポジトリでは現在のディレクトリが**.gitディレクトリの中身そのもの**になっていることが確認できます。

## 応用オプション

### --object-format=\<format\>
#####\<format\> = sha1(default), sha256

gitはプロジェクトの状態をオブジェクトで管理しています。いくつかの種類のオブジェクトがありますが、オブジェクトは全てzlibで圧縮されハッシュ値が生成されています。`--object-format`オプションではハッシュ値のハッシュ関数を指定することができます。Gitではsha1とsha256の2種類のみ指定できます。

※Git Documentationではsha1が推奨されているので特に理由がなければデフォルトのsha1のままで大丈夫です。

### --template=\<template_directory\>
#####\<template_directory\> = テンプレートディレクトリ名

テンプレートとなるディレクトリ(TEMPLATE DIRECTORY)を指定します。TEMPLATE DIRECTORYを事前に設定しておくことで同じような状態を再現することができます。

### --separate-git-dir=\<git dir\>
#####\<git dir\> = Gitリポジトリにするディレクトリ

`git init`を実行すると通常は.gitディレクトリを作成しますが。`--separate-git-dir`オプションを指定すると、本来作成される.gitディレクトリの代わりに**.gitテキストファイル**を生成します。.gitテキストファイルには\<git dir\>で指定されたディレクトリのパスが記載されています。.gitディレクトリに作成されていた一連のファイルは全てこの指定したディレクトリに置かれます。

すでに存在するGitリポジトリで`git init --separate-git-dir`をおこなうとGitリポジトリは\<git dir\>に移動します。

```bash:--separate-git-dirオプション
# 現在のディレクトリ
$ pwd
/home/hogehoge/git_dir

#　オプションを使用
$ git init --separate-git-dir=/home/hogehoge/sep_git_dir/
Initialized empty Git repository in /home/hogehoge/sep_git_dir/

# git_dirディレクトリには.gitファイルが生成
$ ls -a
./  ../  .git

# 作成されたテキストファイルの中身を確認
$ cat .git
gitdir: /home/hogehoge/sep_git_dir/

# sep_git_dirディレクトリにはリポジトリが生成
$ ls /home/hogehoge/sep_git_dir/
config  description  HEAD  hooks/  info/  objects/  refs/
```

このようにすることで`sep_git_dir`をGitリポジトリとして扱い、`git_dir`を作業用ディレクトリとして扱うことができます。作業ディレクトリではGitコマンドを使用できますが.gitディレクトリが存在しないため、ファイル検索がスムーズにおこなえるようになります。また、.gitディレクトリを隠しておくことで誤ってファイルを書き換えてしまうことを防ぐこともできます。

### -b \<branch-name\> / --initial-branch=\<branch-name\>
#####\<branch-name\> = ブランチ名

初期化時に自動で作成されるブランチの名前を指定します。Gitではデフォルトで**master**ブランチが作成されていますが、それ以外の名前にしたいときにこのオプションを使用します。デフォルトのブランチ名は環境変数**init.defaultBranch**で設定されているため、こちらを変更することでデフォルトのブランチ名を設定することもできます。

### --shared=\<permission\>
#####\<option\> = (false|true|umask|group|all|world|everybody|0xxx)

作成しようとしているリポジトリは共有リポジトリとして作成されます。デフォルトではリポジトリは作成したユーザーしかpushができません。複数人で一つのプロジェクトをGitで運用する場合は、--sharedオプションで権限を追加します。

false / umask : umaskの値を利用する。--sharedオプションを使用しない場合も適用される。
true / group : グループに対して書き込み権限を追加する
all / world / everybody : グループに対して書き込み権限を追加し、その他のユーザーに対して読み込み権限を追加する
0xxx : 4桁の数値でパーミッションを指定する

# まとめ
initコマンドはGitリポジトリを作成する際に使用します。自らプロジェクトを立ち上げる際は必ず使用するコマンドなので覚えておきましょう。