Githubでホストされているgitリポジトリがあります。ファイルの多くは当初Windows上で開発されたもので、行末についてはあまり注意しませんでした。最初のコミットを実行したとき、正しい行末を強制するためのgit設定もありませんでした。結論としては、githubリポジトリにCRLFで終わるファイルがいくつかあります。
現在、Linuxで部分的に開発していますが、行末を整理したいと思います。 githubのLFでファイルが正しく保存され、作業コピーにLFがあることを確認するにはどうすればよいですか?
.gitattributes
を含むtext eol=LF
ファイルを設定しました。あれは正しいですか?コミットしてプッシュした状態で、ローカルリポジトリをrm
して、githubから再クローンして、目的の効果を得ることができますか?
リポジトリにどのファイルがあるかについての少しの情報(純粋なソースコード、画像、実行可能ファイルなど)がなければ、質問に答えるのは少し難しいです:)
これに加えて、作業ディレクトリの行末としてデフォルトでLFを使用することを検討します。これは、テキストファイルにLF行末があることを確認するためです。 .gitリポジトリで、WindowsまたはLinuxで作業しているかどうか。申し訳ありませんが...
ただし、より良い代替手段があります。LinuxworkdirのLF行の終わり、Windows workdirの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から。
実世界の例として、これを覗くこともできます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をクリーンであると見なします。
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による回答 。
すべてのテキストファイルに対して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
こちらもご覧ください: