Microsoftストアの Ubuntu 18.04 に Git環境を構築する(旧題：Bash on Ubuntu on Windows にGit環境を構築する)

「Windows 10 April 2018 Update」の Ubuntu 18.04 環境に対応しました。

# Ubuntu環境設定
## OSのインストールと更新
これは沢山記事が出てますので紹介だけ。

参考資料)
[Windows 10でLinuxプログラムを利用可能にするWSL（Windows Subsystem for Linux）をインストールする（バージョン1803対応版）](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)


Gitも最新にしておきます。

```sudo apt install git 
```

## 端末アプリをインストール
標準コンソールの色使いが激しく見難いので、wslttyを入れます。
[wsltty](https://linuxfan.info/wsltty)

この記事と現在の挙動が違っているようですが、
起動はスタートメニューの以下から行えば良いようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/4bc2416a-dd20-4948-4fd2-3dee5609c40b.png)

# Git環境設定
## ユーザ設定

```
$ git config --global user.name [名前]
$ git config --global user.email [メールアドレス]
```

## Gitコマンド補完
デフォルトで設定済みです。
Gitコマンド、ブランチ名、git addではModified,Untrackedファイル名にタブ補完が効きます。

## Gitステータスのコマンドライン常時表示
~/.bashrcに以下を書きます。

```
source /etc/bash_completion.d/git-prompt
export PS1='\[\033[32m\]\u@\h \[\033[33m\]\w\[\033[36m\]$(__git_ps1)\[\033[0m\]\n$ '
GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto
```

コマンドラインに、ブランチ名と編集状態やコミット状態が表示されます。

表示される記号の意味。

```
* ：更新(Modified)ファイルが有る
% ：新規(Untracked)ファイルが有る
+ ：ステージングされた(git add)ファイルが有る
$ ：git stashされたファイルが有る
# ：コミットが無い(git init直後)

> ：ローカルにコミットが有る(ローカルがリモートより進んでいる)
< ：リモートにコミットが有る(ローカルがリモートより遅れている)
<>：ローカルとリモート両方にコミットが有る(マージが必要)
```

参考資料)
[「Git補完をしらない」「git statusを1日100回は使う」そんなあなたに朗報【git-completionとgit-prompt】](http://qiita.com/varmil/items/9b0aeafa85975474e9b6)

## 日本語文字化け対策
日本語ファイル名がエスケープされて読めない文字列になってしまいますので、以下で回避します。

```$ git config --global core.quotepath false
```

参考資料)
[gitで日本語ファイル名を表示する方法](http://qiita.com/kozo/items/08dc2b86ae3ba3f282c3)

## git log を見やすくする
~/.gitconfig に以下を追記します。

```
[alias]
    glog = log --pretty='format:%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=iso --all --graph
    plog = log --pretty='format:%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=iso
```

参考資料)
[git logを見やすくしたい！](http://qiita.com/forest1/items/82ac22596fbe65187a8b)


## Gitのリポジトリを /mnt/c 以下に置く場合
Windowsアプリでも作業出来るようにしたい場合、/mnt/c/Users/username 以下にgit用の作業フォルダを作成します。
わざわざ cd /mnt/c/Users/username とするのも面倒なので、シンボリックリンクを張っておきます。

```
$ cd ~
$ ln -s "/mnt/c/Users/username" win
$ cd win; mkdir gitwork; cd gitwork
$ git init
$ git ...
```

別の方法として、homeディレクトリを /mnt/c/Users/username 以下に移してしまう手も有ります。
/etc/passwd のパスをいじります。

```sudo vi /etc/passwd
```

ただ、GitHubアクセス等で秘密鍵を作るのであれば、/home/username のままの方がいいです。
(~/.sshに作成する秘密鍵のパーミッションが600じゃないとエラーになりますので)


## パーミッションの変更を無視する設定
Windowsフォルダに作業フォルダを作成する場合、パーミッションに気を付ける必要が有ります。

Linux環境で作成してコミットしていたファイルを、Windows環境から再コミットするとパーミッションが書き換わって差分が出てしまうのです。
それを避ける為に、以下の設定をしておきます。(コミット時にパーミッションを無視します)

```git config --global core.filemode false
```

参考資料)
[（よく忘れるので）gitのパーミッション操作の復習](http://qiita.com/maosanhioro/items/aaade68cdca591232159)


# WinMergeをGitの差分・マージツールにする
WSLからWindowsアプリも起動出来るので、WinMergeも使えるようにしておきましょう。

参考資料)
[WSL(Ubuntu 18.04)環境のgitでWinMergeを使う方法](https://qiita.com/forest1/items/334b5d756b5696c63331)


# GitHub 対応
## pushする為のSSH keyを作成する
公開鍵・秘密鍵というやつです。

鍵を作成します。
既に ~/.ssh/id_rsa が有る場合は、-fオプションで別のファイル名を指定して下さい。
```$ ssh-keygen -t rsa -C "メールアドレス"
```

## 秘密鍵のパーミッションを確認する
秘密鍵のid_rsaは、パーミッションが600じゃないとエラーになります。

```$ ls -la ~/.ssh
```

id_rsaのパーミッションが、
``` -rw------- ```
となっていればOKです。

なっていなければ、以下を実行します。

```$ chmod 600 ~/.ssh/id_rsa
```

## GitHubに公開鍵を設定する
### 公開鍵をコピーします。
以下でクリップボードに公開鍵をコピーします。

```$ cat ~/.ssh/id_rsa.pub | clip.exe
```

### GitHubに登録します
GitHubサイトの右上、アカウントのSettingsから "SSH and GPG keys" を選択します。

右上の"New SSH key"を押し、
- Titleに自分が分かる名前
- keyにクリップボードから公開鍵をペースト
- "Add SSH key"を押す
で完了です。

### 接続確認
クライアントから以下コマンドを入力し、

```$ ssh -T git@github.com
```

以下質問にyesで答えます。
Are you sure you want to continue connecting (yes/no)? 

以下が表示されればOKです。

```
Hi [github登録ID] ! You've successfully authenticated, but GitHub does not provide shell access.
```

## GitHubからクローンする場合
"Clone or download"ボタンからcloneする時に、"Use ssh"を選択しておき、
urlが git@ から始まるアドレスになっていることを確認します。

httpsだと、普通のパスワード認証になってしまい、pushする際に毎回IDとパスワードが聞かれてしまいます。