やりたいこと
例えば以下のようなコミットがあります。
- ファイルAをコミット
- Aに対して変更Bを追加
- Aに対して変更Cを追加(以下同様)
この作業後に、Aの改行コードがCRLFになっていたのを気づいて、 LFに直したいときに、変更Bの前にCRLF→LFへの変更をコミットする方法です。 別に改行コードを最後に変換したのでもいいんですが、diffに^Mが入るのが嫌なんですよね。
前提条件
git 2.16.2で動作確認しています。
概要
.gitattributesファイルと、マージ戦略のオプションを指定します。
手順
- 変更Bを追加する前のコミットを起点に、ブランチを切ります。
- 改行のみ変更してコミットします。
- .gitattributesファイルを作成して次の行を追加します。既にある場合は追加します。
ファイル名 eol=lf
- このファイルはコミットやステージに追加しないで構いません。
- 以下のコマンドを実行します。
git cherry-pick コミットのハッシュ --strategy-option=renormalize
- 複数のコミットがある場合はそれぞれcherry-pickを繰り返します。
これで意図した通りになっているブランチができます。
補足
--strategy=recursive
のオプションの説明をしているサイトもありますが、
現在のマージ戦略のデフォルトはrecursiveアルゴリズムのため、不要です1。
また、--strategy-option=ignore-space-at-eol
というオプションもありますが、
これは比較時に改行コードを無視するだけで、
マージ後はCRLFになってしまいます。
-
man git-merge
より、This is the default merge strategy when pulling or merging one branch.
と書かれている。 ↩︎
外部サイト
- Is it possible for git-merge to ignore line-ending differences? - Stack Overflow
- Ubuntu Git その227 - Recursiveマージストラテジーとは(git merge) - kledgeb
- Ubuntu Git その236 - Recursiveマージストラテジーで、gitattributesで定義した属性を適用してから、マージする(git merge) - kledgeb
マニュアル
- Git
- merge: まだありません。
- eol: まだありません。