web-dev-qa-db-ja.com

gitリポジトリおよび作業コピーでLF eolを強制する

Githubでホストされているgitリポジトリがあります。ファイルの多くは当初Windows上で開発されたもので、行末についてはあまり注意しませんでした。最初のコミットを実行したとき、正しい行末を強制するためのgit設定もありませんでした。結論としては、githubリポジトリにCRLFで終わるファイルがいくつかあります。

現在、Linuxで部分的に開発していますが、行末を整理したいと思います。 githubのLFでファイルが正しく保存され、作業コピーにLFがあることを確認するにはどうすればよいですか?

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

149
Chowlett

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

これに加えて、作業ディレクトリの行末としてデフォルトでLFを使用することを検討します。これは、テキストファイルにLF行末があることを確認するためです。 .gitリポジトリで、WindowsまたはLinuxで作業しているかどうか。申し訳ありませんが...

ただし、より良い代替手段があります。LinuxworkdirのLF行の終わり、Windows workdirのCRLF行の終わり、およびリポジトリのLF行の終わりから恩恵を受けます。

LinuxとWindowsで部分的に作業しているので、core.eolnativeに設定され、core.autocrlftrueに設定されていることを確認してください。

次に、.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から。

実世界の例として、これを覗くこともできますcommit.gitattributesファイルへの変更は実証済み。

次のコメントを考慮して回答を更新します

Linux環境は実際にはWindowsディレクトリを共有するVirtualBoxであるため、WindowsディレクトリにCRLFは必要ありません

理にかなっています。説明をありがとう。この特定のコンテキストでは、.gitattributesファイルだけでは十分ではありません。

リポジトリに対して次のコマンドを実行します

$ git config core.eol lf
$ git config core.autocrlf input

リポジトリはLinux環境とWindows環境の間で共有されるため、これにより両方の環境のローカル設定ファイルが更新されます。 core.eolは、チェックアウト時にテキストファイルにLF行の末尾が付いていることを確認します。 core.autocrlfは、テキストファイルのpotentialCRLF(たとえば、コピー/貼り付け操作の結果)がリポジトリでLFに確実に変換されるようにします。

必要に応じて、次のようなものを含む.gitattributesファイルを作成することにより、Gitがテキストファイルとは何かを区別できるようにすることができます。

# 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はworkdirをクリーンであると見なします。

207
nulltoken

Git 2.10以降では、各テキストファイルを個別に列挙する必要はありません。 Git 2.10はeol = lfとともにtext = autoの動作を修正しましたソース

gitリポジトリのルートにある.gitattributesファイル:

* text=auto eol=lf

追加してコミットします。

その後、次の手順を実行すると、すべてのファイルが正規化されます。

git rm --cached -r .  # Remove every file from git's index.
git reset --hard      # Rewrite git's index to pick up all the new line endings.

ソース: kenorbによる回答

89
koppor

すべてのテキストファイルに対してLF行の終わりを強制するには、次の行を使用してリポジトリの最上位に .gitattributes ファイルを作成できます(必要に応じて変更します)。

# Ensure all C and PHP files use LF.
*.c         eol=lf
*.php       eol=lf

これにより、Gitがテキストファイルと見なすすべてのファイルが、リポジトリ内の正規化された(LF)行終端を持つようになります(通常、core.eol構成は、デフォルトでどのファイルを使用するかを制御します)。

新しい属性設定に基づいて、CRLFを含むすべてのテキストファイルをGitで正規化する必要があります。これが自動的に行われない場合は、行末を変更した後、手動でリポジトリを更新できるため、次の手順で作業ディレクトリを再スキャンしてコミットできます(作業ディレクトリをクリーンにする)。

$ echo "* text=auto" >> .gitattributes
$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

または GitHub docs

git add . -u
git commit -m "Saving files before refreshing line endings"
git rm --cached -r . # Remove every file from Git's index.
git reset --hard # Rewrite the Git index to pick up all the new line endings.
git add . # Add all your changed files back, and prepare them for a commit.
git commit -m "Normalize all the line endings" # Commit the changes to your repository.

@ Charles Bailey post も参照してください。

また、テキストとして扱われないファイルを除外する場合は、テキスト属性を設定解除します。

manual.pdf      -text

または、バイナリとして明示的にマークします。

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

より高度なgit正規化ファイルを表示するには、- Drupalコア.gitattributes を確認してください。

# Drupal git normalization
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# @see https://www.drupal.org/node/1542048

# Normally these settings would be done with macro attributes for improved
# readability and easier maintenance. However macros can only be defined at the
# repository root directory. Drupal avoids making any assumptions about where it
# is installed.

# Define text file attributes.
# - Treat them as text.
# - Ensure no CRLF line-endings, neither on checkout nor on checkin.
# - Detect whitespace errors.
#   - Exposed by default in `git diff --color` on the CLI.
#   - Validate with `git diff --check`.
#   - Deny applying with `git apply --whitespace=error-all`.
#   - Fix automatically with `git apply --whitespace=fix`.

*.config  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.css     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.dist    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.engine  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.html    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html
*.inc     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.js      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.json    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.lock    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.map     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.md      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.module  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.php     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.po      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.script  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.sh      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.sql     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.svg     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.theme   text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.twig    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.txt     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.xml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.eot     -text diff
*.exe     -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff
*.jpg     -text diff
*.otf     -text diff
*.phar    -text diff
*.png     -text diff
*.svgz    -text diff
*.ttf     -text diff
*.woff    -text diff
*.woff2   -text diff

こちらもご覧ください:

22
kenorb