1. ホーム
  2. ギット

[解決済み】gitレポと作業コピーでLF eolを強制する

2022-04-10 08:03:57

質問

私はgithubでホストされているgitリポジトリを持っています。当初はWindowsで開発したファイルが多く、改行コードにあまり気を遣っていませんでした。最初のコミットを行ったとき、正しい改行コードを強制するためのgitの設定も行っていませんでした。その結果、私のgithubリポジトリには、改行コードがCRLFのファイルが多数存在することになりました。

今、部分的にLinuxで開発しているのですが、改行コードをきれいにしたいんです。どうすれば、ファイルがgithub上でLFで正しく保存され、私の作業コピーでもLFであることを確認できますか?

を設定したのですが .gitattributes を含むファイル text eol=LF でいいのでしょうか?コミットされ、プッシュされた状態で、私は rm ローカルにある私のレポを github から再クローンして、望ましい効果を得ることができますか?

どのように解決するのですか?

リポジトリにどのようなファイル(純粋なソースコード、画像、実行ファイル、...)があるかについての情報が少しないと、この質問に答えるのは少し難しいです :)

これとは別に、作業ディレクトリの行末をLFにするのは、WindowsでもLinuxでも、.gitリポジトリのテキストファイルの行末をLFにすることを望んでいるからだと考えることにします。確かに、転ばぬ先の杖ですね...。

しかし、もっと良い方法があります。LinuxのワークディレクトリではLF改行、WindowsのワークディレクトリではCRLF改行、そしてリポジトリではLF改行の恩恵を受けられるのです。

LinuxとWindowsで部分的に作業しているので、必ず core.eol が設定されています。 nativecore.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氏より。

実例として、こちらも覗いてみてください。 コミット ここで、それらの変更を .gitattributes ファイルのデモを行います。

以下のコメントを考慮して回答をUPDATEしてください。

私の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 は、まだワークディールをクリーンと見なすべきです。