OPはマルチOSソリューションの必要性に言及しているため、この回答は適切であると思われます。このGithub ヘルプ記事では、OSを越えて行末を処理するための利用可能なアプローチについて詳しく説明しています。クロスOSラインエンディングを管理するためのグローバルなアプローチとリポジトリごとのアプローチがあります。
グローバルな取り組み
LinuxまたはOS XでGit行末処理を構成します。
git config --global core.autocrlf input
WindowsでGitの行末処理を構成します。
git config --global core.autocrlf true
レポごとのアプローチ:
リポジトリのルートで、.gitattributes
ファイルを作成し、プロジェクトファイルの行末設定を次の形式で一度に1行ずつ定義します。path_regex line-ending-settings
ここline-ending-settings
で、は次のいずれかです。
- テキスト
- バイナリー(Gitが行末を変更してはならないファイル)
text
値が一致するファイルのための行末を処理する方法にGitの指示にさらに構成することができます。
text
-行末をOSネイティブの行末に変更します。
text eol=crlf
-行末CRLF
をチェックアウト時にに変換します。
text eol=lf
-行末LF
をチェックアウト時にに変換します。
text=auto
-行ハンドルをGitの裁量に任せる適切なデフォルト。
サンプルの.gitattributesファイルの内容は次のとおりです。
# Set the default behavior for all files.
* text=auto
# Normalized and converts to
# native line endings on checkout.
*.c text
*.h text
# Convert to CRLF line endings on checkout.
*.sln text eol=crlf
# Convert to LF line endings on checkout.
*.sh text eol=lf
# Binary files.
*.png binary
*.jpg binary
ここで行末の設定を変更した後、リポジトリを更新する方法の詳細。Tldr:
Gitを使用してファイルをバックアップし、リポジトリ内のすべてのファイル(.gitディレクトリを除く)を削除してから、ファイルを一度に復元します。現在のファイルをGitに保存して、作業内容が失われないようにします。
git add . -u
git commit -m "Saving files before refreshing line endings"
インデックスを削除し、Gitに作業ディレクトリの再スキャンを強制します。
rm .git/index
Gitインデックスを書き換えて、すべての新しい行末を取得します。
git reset
再書き込みされ、正規化されたファイルを表示します。
場合によっては、これで十分です。他のユーザーは、次の追加手順を完了する必要がある場合があります。
git status
変更したファイルをすべて追加し、コミットの準備をします。これは、変更されたファイルがある場合は、それを検査するチャンスです。
git add -u
「警告:ファイル内のCRLFはLFに置き換えられます。」というメッセージがここに表示されても、完全に安全です。
.gitattributesファイルを書き換えます。
git add .gitattributes
変更をリポジトリにコミットします。
git commit -m "Normalize all the line endings"