はじめてdotfilesを作成してみる。

開発環境の設定を短縮できるdotfilesを作成したいと思い、いろいろ調べています。
今回は、dotfilesをとりあえず作ってみて、大まかな手順を記録していきます。


## dotfilesを作成する流れ

#### `GitHub`で新しいリポジトリ`dotfiles`を作成する
1. Githubにログインしてマイページに進み`repositories`メニューに進む
1. `New`ボタンから、リポジトリ新規作成画面`Create a new repository`に進む
1. `Repository name`の箇所に`dotfiles`と入力する
1. その他の設定は特にいじらなくてもOK(外部公開したくない場合は`private`を選択)
1. `Create repository`ボタンでリポジトリ作成完了



#### 作成した`dotfiles`リポジトリをホームディレクトリ直下に`git clone`する

1. Githubで作成したリポジトリ`dotfiles`をGit管理するために、まずはcloneしてローカルに落としていきます。
1. Githubで作成した`dotfiles`リポジトリの画面にて、`Quick setup — if you’ve done this kind of thing before`という項目にある、`SSH`ボタンを選択します。
1. おそらく`git@github.com~~`から始まるユーザー名・リポジトリ名が記載されたコードが表示されるので、そのコードをコピーします。
1. 次に、以下のコマンドを順番に実行することで自身のPCローカルリポジトリにcloneしてくることができます。



```
$ cd ~/ （もしくは cd だけでもOK）
$ git clone git@github.com:[ユーザー名]/[リポジトリ名].git
$ cd dotfiles
$ git init
```
※ `cd ~/`　cloneしてくる場所はPCのホームディレクトリ直下です。
※ `git clone` はGithubからクローンするGitコマンドです。
※ クローンしたら`cd dotfiles`コマンドで対象のディレクトリ`dotofiles`に移動します。
※ `git init` はGitコマンドの一つで、新たにリポジトリを作成するときに使います。
※ `git init`コマンドを実行すると、現在のディレクトリに`.git`というディレクトリが作成され、その中にGitのリポジトリに必要なデータ構造が作られます。
※ つまり、`git init`を実行することで、このリポジトリがGit管理となることを意味します。

なお、`git clone`をした段階で、以下のようなファイルが構成されました。

`$ tree -a`コマンドを実行
```
.
├── .DS_Store
└── .git
    ├── HEAD
    ├── config
    ├── description
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-merge-commit.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── prepare-commit-msg.sample
    │   ├── push-to-checkout.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── .DS_Store
        ├── heads
        └── tags
```

※ 今回、私の場合は、`$ git init`を実行した際、このような表示が出ました。

```
Reinitialized existing Git repository in /***/*****/dotfiles/.git/
```
`リポジトリを再初期化した`という意味のようで、ドキッとしましたが、特にファイルの中身が変わった様子ではなかったです。`git clone`した時点で初期化は済んでいて、`git init`は今回は不要だったのかな、、、？

ともかく、これで`dotfiles`リポジトリをGit管理する下準備ができました。


#### dotfilesで管理するファイルを選ぶ

- 本題である`何の設定をdotfilesで管理するのか？`ということですが、、、
- 今回は`zsh`のコマンド設定ファイル`.zshrc`を保存しましょう。
- 現在保存されている場所はホームディレクトリ直下`~/.zshrc`となっています。

##### 【補足】Zshとは？
- 「ズィーシェル」と読む（もしくは「ゼットシェル」？）。
- ZshはUnixシェルの一つで、シェルスクリプトの実行やコマンドラインでの操作を可能にするツールである。
- Bashと同様に広く使われているが、Zshはより高度な設定やカスタマイズが可能であったり、ユーザーフレンドリーな特性を持っている。
- `.zshrc`ファイルは、Zshの設定ファイルである。
- Zshを使うときに自動的に読み込まれる。
- パスの設定やエイリアスの定義、関数の定義など、Zshの動作をカスタマイズするコードを書くことが多い。
- 保存されるパスは一般的にルートディレクトリ直下`~/.zshrc`であることが多い。
- Mac OSでは隠しファイルなので、`cmd + shift + .`で隠しファイルを表示させないと閲覧・編集できない(FinderやVScodeなどでファイルを開く時)。

※ シェルやシェルスクリプトについては、こちらの記事でまとめています。

https://qiita.com/ym0628/items/f429f1cf44b4146a326f


##### 【補足】.zshrcに記述しているコード
一応、`.zshrc`にどんな設定がなされているかも確認しておきます。

```zsh:~/.zshrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
```


1. このコードは`rbenv（Rubyのバージョン管理ツール）`、`nodenv（Node.jsのバージョン管理ツール）`、`pyenv（Pythonのバージョン管理ツール）`をセットアップするための設定を行っている。
1. `export PATH="$HOME/.rbenv/bin:$PATH"` : `rbenvのバイナリ`があるディレクトリを`PATH環境変数`に追加している。これにより、どのディレクトリからでも`rbenvコマンド`を使えるようになる。
1. `eval "$(rbenv init -)"` では、`rbenv`を初期化し、`シェル`に`rbenv`の設定を読み込ませるためのコマンドだ。
1. `export PATH="$HOME/.nodenv/bin:$PATH"` これは、`nodenvのバイナリ`があるディレクトリを`PATH環境変数`に追加している。これにより、どのディレクトリからでも`nodenv`コマンドを使えるようになる。
1. `eval "$(nodenv init -)"` これは、`nodenv`を初期化し、`シェル`に`nodenv`の設定を読み込ませるためのコマンドである。
1. `export PYENV_ROOT="$HOME/.pyenv"` と `export PATH="$PYENV_ROOT/bin:$PATH"` これは、`pyenvのルートディレクトリ`と`バイナリ`があるをディレクトリを`PATH境環変数`に追加している。これにより、どのディレクトリからでも`pyenvコマンド`を使えるようになる。
1. `eval "$(pyenv init --path)"` と `eval "$(pyenv init -)"` これは、`pyenv`を初期化し、`シェル`に`pyenv`の設定を読み込ませるためのコマンドである。


#### dotfilesに管理したいファイルを保存する

dotfilesで管理するファイルを決めたら、実際にファイルを移動させていきます。
1. `mvコマンド`で`.zshrc`を`dotfiles`にコピーする（念の為、移動ではなくコピーにして、元のファイルも残しておくことにしました。正しいかどうかは正直わからないですが、、、）。

```
$ mv ~/.zshrc ~/dotfiles/.zshrc
```

もう一度、`tree -a`コマンドで確認してみましょう。
```diff
.
├── .DS_Store
├── .git

（中略）

│       ├── heads
│       └── tags
+ └── .zshrc  # dotfilesに設定ファイルをコピーできました。
```

#### 元の場所（パス）ににシンボリックリンクを作成する。
- シンボリックリンクは、Windowsで言うところのショートカットのことです。
- `ln`コマンドは、ディレクトリやファイルへのリンクを登録するコマンドです。
- オプションで`-s`を指定することでシンボリックリンクを作成します。

```
$ ln -s ~/dotfiles/.zshrc ~/.zshrc
```
![スクリーンショット 2023-08-11 18.18.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486945/2eba9cca-ce6b-0173-18c4-f8788e92fcd0.jpeg)

- シンボリックリンクがうまく出来ると、このようにファイルのアイコンに矢印が出来ます。

#### Git管理しなくて良いファイルを`.gitignore`に指定する
- 自分の場合、Mac環境を使っているので、`DS_store`をGitのコミット対象から除外したいです。
- そのため、`dotfiles`ディレクトリに新しく`.gitignore`ファイルを作成します。

```
$ touch .gitignore
```
- 作成した`.gitignore`ファイルにコミット対象から除外したいファイルを記述します。
```
# macOS
.DS_Store
```
- `git status`で確認すると、DS_Storeが変更差分から外れました。これでひとまずOKとします。
```diff
$ git status

Untracked files
  (use "git add <file>..." to include in what will be committed)
-   .DS_Store(コミット対象から外れた)
	.gitignore
	.zshrc
```


#### コミット 〜　プッシュを実施

- ひとまずこれで、コミットし、Githubのリポジトリにプッシュしていきます。
```
$ git add .
$ git commit -m "initial commit"
$ git push
```
- これで、dotfilesをGit管理にすることができました。
- あとは、PC環境が変わった際などに、`git clone`し、シンボリックリンクを作成すればOKということになります。


#### 【補足】 `make -C`コマンドについて

```
$ make -C ~/dotfiles
```
- `make -C ~/dotfiles`というコマンドは、`~/dotfiles`ディレクトリに移動してから`makeコマンド`を実行するという意味である。
- この`-C`オプションは、指定したディレクトリで`Makefile`を探し、そのディレクトリで`makeコマンド`を実行する機能を持っている。
- だから、`~/dotfiles`ディレクトリに`Makefile`が存在する場合、その`Makefile`に書かれたタスクが実行される。
- `$ make -C ~/dotfiles`コマンドは必ずしも実行する必要はない。
- このコマンドは、`~/dotfiles`ディレクトリ内の`Makefile`に書かれたタスクを実行するもの。
- なので、`Makefile`が存在しない場合や、`Makefile`を使わずに`dotfiles`を設定したい場合はこのコマンドを使わなくても大丈夫です。



## 参考サイト

<a href="https://qiita.com/yutkat/items/c6c7584d9795799ee164">ようこそdotfilesの世界へ</a>という記事を投稿された@yutkat 様のdotfilesは、非常に参考になるかと思います。

https://github.com/yutkat/dotfiles

また、@rainbartown 様の記事で紹介されていたdotfilesも参考になるので、ぜひご覧ください。

https://qiita.com/rainbartown/items/d7f59fe4047733c14e8b

https://github.com/rainbartown/dotfiles-sample


dotfilesを作成する手順について、細かく解説されているこちらの記事も参考になりました。

https://ramble.impl.co.jp/2755/