2017/03/08

git repository 中の CRLF を LF に一括変換する

以下のサイトを参考に自分用にちょっとアレンジ。特にバイナリを変換しちゃいそうになって危なかったので。

- [Git for Windows でレポジトリー上の CR LF を LF に変換する手順 - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2014/03/28/git-crlf-to-lf/)



### CRLF を使っているファイルを確認する
```console
`gutter: false;
$ git grep --cached -l -I $'\r$'
contain_crlf.txt
```

`autocrlf=true`/`input` に設定されている場合、ワークツリーのファイルとリポジトリの改行コードが一致していない可能性があるので、`--cached` を指定します。
また、`-I` を指定することでバイナリファイルを除外しますこれを忘れて危うくバイナリ壊しちゃうところでした…。


### 一時的に autocrlf を false にする
```console
`gutter: false;
$ git config core.autocrlf false
```

### work tree を更新する
`.git` ディレクトリを除いて消去し`autocrlf` を変更した際、設定を反映させてチェックアウトしなおすには、ワークツリーのファイルを消すしかないようです、チェックアウトしなおします。

```console
`gutter: false;
$ ls -A --color=never -I .git | xargs rm -rf
$ git checkout -- .
```

`--color=never` はフェイルセーフです。
> 参考
> - [ls の出力が文字化けみたいになってしまう原因 | 穀風](https://kokufu.blogspot.jp/2017/03/ls.html)


### 確認する
`--cached` をはずして grep をかけ、リポジトリがワークツリーに反映されていることを確認します。

```console
`gutter: false;
$ git grep -l -I $'\r$'
contain_crlf.txt
```


### 改行コードを変換
今回は [nkf](https://github.com/nurse/nkf) を使いましたが、変換はお好きなツールでどうぞ。

```console
`gutter: false;
$ git grep -l -I $'\r$' | xargs nkf -Lu --overwrite
```

> Windows 用 nkf はこちら
> - [nkf.exe nkf32.dll Windows用の詳細情報 : Vector ソフトを探す!](http://www.vector.co.jp/soft/win95/util/se295331.html)


### コミットして確認
コミットして良い子は `-a` オプションを安易に使ってはいけません :-p `--cached` つきの grep をかけます。
何も表示されなかったら成功。

```console
`gutter: false;
$ git commit -a
$ git grep --cached -l -I $'\r$'
```

### autocrlf を元に戻す
今後も CRLF が混在してしまうような環境であるなら、設定しておいた方が良いでしょう。
`true` もしくは `input` に戻します。

```console
`gutter: false;
$ git config core.autocrlf input
```

0 件のコメント: