Gitの始め方

# Summary
[最初に入れるやつら2021](https://qiita.com/y_marui/items/0ce03b01de0e7ea02de1)に付け足す`git`のパートが長いので分離。 

Personal access tokensは微妙なので`ssh`でアクセス。
ローカルのユーザー名は`hoge`。
リモートのユーザー名は`huga`。
リモートは、基本的にGitHubを使用。
GitHubで複数アカウントがある場合は、拡張機能の[Account Switcher](https://chrome.google.com/webstore/detail/account-switcher/jinpjibnadoelhjknokddcbmkpfjggmc)が便利。

# `~/.gitignore_global`の設定
OSとエディタに由来する部分は、`~/.gitignore_global`に入れとく。
Macなら、
```zsh
gibo dump macOS VisualStudioCode VisualStudio >> ~/.gitignore_global
```
Windowsなら、
```zsh
gibo dump Windows VisualStudioCode VisualStudio >> ~/.gitignore_global
```

# `ghq`
```~/.gitconfig
[ghq]
  root = /path/to/src
```
`/path/to/src`は、`/Users/USERNAME/src`や`C:\\Users\\USERNAME\\src`にしている。バックスラッシュをエスケープして`\\`にする必要があることに注意。`~`や`$HOME`は展開されない。

## `fzf` on <font color=red>Mac</font>
```shell:~/.zshrc
# git
# Exit with esc while choosing directory
compdef _g g
function g(){
  case "$1" in
    root )
      git config ghq.root;;
    * )
      target="$(ghq list -p | sort -fV | fzf)"
      echo $target
      if [ -n "$target" ]; then 
        cd "$target"
      fi;;
  esac
}
function _g() { _values '' 'root' }
```

## `fzf` on <font color=blue>Windows</font>
```shell:~\Documents\PowerShell\profile.ps1
# git
# Exit with esc while choosing directory
function g () {
    switch ($Args[0]) {
        'root' {
            git config ghq.root
        }
        default {
            $target="$(ghq list -p | sort | fzf)"
            # `ghq list -p`が動かないとき
            # $target = "$((Get-ChildItem -Path $(ghq root) -Depth 3 -Hidden -Filter .git).parent.FullName | sort | fzf)"
            echo $target
            if ($target) {
                cd "$target"
            }
        }
    }
}
```

# Public key authentication
## Key pairをローカルで作成
```zsh
ssh-keygen
> Enter file in which to save the key (/path/to/.ssh/id_rsa): /path/to/.ssh/github
> Enter passphrase (empty for no passphrase):
```
`/path/to/.ssh`　は、`/Users/hoge/.ssh`とか。
`passphrase`は、くれぐれも忘れないように。

## GitHubに登録
[Settings > SSH and GPG keys](https://github.com/settings/ssh)に公開鍵の設定する。
```zsh
pbcopy < /path/to/.ssh/github.pub
```

## alias
```~/.ssh/config
Host github
    HostName github.com
    User git
    Port 22
    IdentityFile /path/to/.ssh/github
    UseKeychain yes
    AddKeysToAgent no
```

## 疎通確認
```zsh
ssh -T github
> Enter passphrase for /path/to/.ssh/github:
> Hi huga! You've successfully authenticated, but GitHub does not provide shell access.
```
`passphrase`がログイン時に必要。

## `git`と`ssh`をリンク
```~/.gitconfig
[url "github:"]
    InsteadOf = https://github.com/
    InsteadOf = git@github.com:
```
リモートを確認する。
```zsh
git remote -v
```

# 複数のアカウントを使い分け
## 複数のアライアスを準備
```~/.ssh/config
Host github-1
    HostName github.com
    User git
    Port 22
    IdentityFile /path/to/.ssh/github-1
    UseKeychain yes
    AddKeysToAgent no

Host github-2
    HostName github.com
    User git
    Port 22
    IdentityFile /path/to/.ssh/github-2
    UseKeychain yes
    AddKeysToAgent no
```

## 疎通確認
```zsh
ssh -T github-1
ssh -T github-2
```

## ユーザーの切り替え
```~/.gitconfig
[user]
	name = 
	email = 
[includeIf "gitdir:/path/to/src/github.com/huga-1/"]
	path = ~/.gitconfig-1
[includeIf "gitdir:/path/to/src/github.com/huga-2/"]
	path = ~/.gitconfig-2
```
ディレクトリごとに`~/.gitconfig-#`へ振り分ける。
```~/.gitconfig-#
[user]
	name = huga-#
	email = xxxxxxxx+huga-#@users.noreply.github.com
[url "github-#:"]
	InsteadOf = https://github.com/
	InsteadOf = git@github.com:
```
`#　=　1,　2`。
`~/.gitconfig-#`に、ユーザーや`ssh`の情報を書き込む。

# References
* [ローカルに点在するgitリポジトリを一元管理したいアナタに教えたいghq-migrator | Developers.IO](https://dev.classmethod.jp/articles/ghq-migrator-for-exists-local-git-repository/)
* [6歳娘｢パパ、プロジェクトフォルダを見つけるのに何時間かけるの？｣【ghq+fzf+zsh】 - Qiita](https://qiita.com/tomoyamachi/items/e51d2906a5bb24cf1684#preview--%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%AB%E3%83%BC%E3%83%88%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%AA%E3%82%B9%E3%83%88)
* [さいつよのターミナル環境を構築しよう - Qiita](https://qiita.com/b4b4r07/items/09815eda8ef72e0b472e#ghqgo-%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB)
* [GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
* [[備忘] 複数Githubアカウントでssh接続設定(config)を使い分ける手順](https://qiita.com/yampy/items/24638156abd383e08758)
* [GitHub 接続時の ~/.ssh/config の書き方](https://zenn.dev/nikaera/articles/ssh-config-github)
* [git configをプロジェクトによって使い分ける - Qiita](https://qiita.com/htanjo/items/51245c08327a31da73f4)