私は github でホストされている git リポジトリを持っています。ファイルの多くは当初 Windows で開発されていたため、行末についてはあまり注意していませんでした。最初のコミットを実行したときも、正しい行末を強制するための git 構成は何もありませんでした。その結果、私の github リポジトリには CRLF 行末のファイルが多数存在しています。
現在、Linux で部分的に開発を行っており、行末をクリーンアップしたいと考えています。ファイルが LF で github に正しく保存され、作業コピーに LF が含まれるようにするにはどうすればよいでしょうか?
.gitattributes
;を含むファイルを設定しましたがtext eol=LF
、正しいでしょうか? これをコミットしてプッシュしたら、rm
ローカル リポジトリを作成して github から再度クローンするだけで、目的の効果が得られますか?
ベストアンサー1
リポジトリにどのようなファイル(純粋なソースコード、イメージ、実行可能ファイルなど)が含まれているかに関する情報がないと、質問に答えるのは少し難しいです :)
これに加えて、Windows と Linux のどちらで作業するかに関係なく、.git リポジトリ内のテキスト ファイルの行末が LF であることを確認したいので、作業ディレクトリ内の行末を LF にデフォルト設定することにも同意します。確かに、安全第一です...
ただし、より優れた代替手段があります。Linux ワークディレクトリの LF 行末、Windows ワークディレクトリの CRLF 行末、リポジトリの LF 行末を活用できます。
Linux と Windows で部分的に作業しているので、core.eol
が に設定されnative
、core.autocrlf
が に設定されていることを確認してくださいtrue
。
次に、ファイルの内容.gitattributes
を次のように置き換えます。
* text=auto
これにより、コミットおよびチェックアウト時に Git が自動で行末変換を処理できるようになります。バイナリ ファイルは変更されませんが、テキスト ファイルとして検出されたファイルでは、行末がオンザフライで変換されます。
ただし、リポジトリの内容がわかっている場合は、Git に協力して、バイナリ ファイルからテキスト ファイルを検出するのを手伝うことができます。
Cベースの画像処理プロジェクトで作業している場合は、ファイルの内容を.gitattributes
次のように置き換えます。
* text=auto
*.txt text
*.c text
*.h text
*.jpg binary
これにより、拡張子が c、h、または txt のファイルはリポジトリに LF 行末で保存され、作業ディレクトリにはネイティブの行末が設定されます。Jpeg ファイルは変更されません。その他すべては、上記と同じ自動フィルタリングの恩恵を受けます。
このすべての内部の詳細をより深く理解するために、Githubber の Tim Clem による非常に優れた投稿「Mind the end of your line」を詳しく読むことをお勧めします。
実際の例として、ファイルへの変更が実証されているこのコミット.gitattributes
を確認することもできます。
以下のコメントを考慮して回答を更新します
私のLinux環境は実際にはWindowsディレクトリを共有するVirtualBoxなので、WindowsディレクトリにCRLFは不要です。
なるほど。ご説明ありがとうございます。この特定の状況では、.gitattributes
ファイルだけでは不十分です。
リポジトリに対して次のコマンドを実行します
$ git config core.eol lf
$ git config core.autocrlf input
リポジトリは Linux 環境と Windows 環境間で共有されるため、両方の環境のローカル構成ファイルが更新されます。core.eol
チェックアウト時にテキスト ファイルの行末が LF になることを確認します。core.autocrlf
テキストファイル内の潜在的なCRLF (たとえば、コピー/貼り付け操作の結果) がリポジトリ内で LF に変換されることを確認します。
オプションとして、次のような内容を含むファイルを作成することで、Git がテキスト ファイルを区別できるようにすることができます。.gitattributes
# Autodetect text files
* text=auto
# ...Unless the name matches the following
# overriding patterns
# Definitively text files
*.txt text
*.c text
*.h text
# Ensure those won't be messed up with
*.jpg binary
*.data binary
ファイルを作成することにした場合は.gitattributes
、コミットします。
最後に、「コミットするものがない(作業ディレクトリがクリーン)」とgit status
記載されていることを確認し、次の操作を実行します。
$ git checkout-index --force --all
これにより、構成の変更とファイルを考慮して作業ディレクトリにファイルが再作成され.gitattributes
、テキスト ファイル内の見落とされた可能性のある CRLF が置き換えられます。
これが完了すると、作業ディレクトリ内のすべてのテキスト ファイルは LF 行末を持つようになり、git status
作業ディレクトリは引き続きクリーンであるとみなされるようになります。