web-dev-qa-db-ja.com

Gitで作業ツリーの行末を正規化する方法は?

一貫性のない行末を持つリポジトリを複製しました。正規化するファイルのテキスト属性を設定する.gitattributesを追加しました。変更をコミットすると、次のメッセージが表示されます。

warning: CRLF will be replaced by LF in FILE.
The file will have its original line endings in your working directory.

Gitでファイルの作業コピーを正規化するにはどうすればよいですか?できればgitで作業ツリー全体を正規化してください。

54
user11171

Gitクライアント2.16以降では、これを行うためのはるかに簡単な方法があります。単にgit add --renormalize .

60
philippn

V2.16以降を使用している場合は、単に次を使用できます。

git add --renormalize .  # Update index with renormalized files
git status               # Show the files that will be normalized
git commit -m "Introduce end-of-line normalization"

これらの方向は、 gitattributes からまっすぐです。古いバージョンの場合、 docs (v2.12より前)は異なる答えを提供します:

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"

編集した後、このシーケンスを実行します.gitattributes

更新

一部のユーザーは上記の手順で問題を抱えているようです。 gitattributes (2.12から2.14)の更新されたドキュメントは、新しい一連の指示を示しています(.gitattributesファイルの編集後)。

git read-tree --empty   # Clean index, force re-scan of working directory
git add .
git status        # Show files that will be normalized
git commit -m "Introduce end-of-line normalization"

これを指摘してくれた @ vossad01 に感謝します。

また、どちらのソリューションでも、作業コピーのファイルは古い行末を保持します。それらを更新したい場合は、作業ツリーがクリーンであることを確認して、以下を使用します:

git rm --cached -r .
git reset --hard

これで、作業ツリーで行末が正しくなります。

82

代替アプローチ(使用するコマンドのみが異なります)

リポジトリに保留中の変更がないことを確認します。

$ git status
$ git stash

変更.gitattributesしたがって、CRLFの解釈が変更されます。

$ echo "*.txt  text" >>.gitattributes
$ git commit -m "Made .txt files a subject to CRLF normalization." -- .gitattributes

インデックスからデータを削除し、作業ディレクトリを更新します。

$ git rm --cached -r .
$ git reset --hard

Gitが提案するCRLF修正を確認します。

$ git ls-files --eol
$ git status
$ git diff

Gitの決定に同意します。

$ git add -u
$ git commit -m "Normalized CRLF for .txt files"

クリーンクローンが行われたかのように変更をリロードします。

$ git rm --cached -r .
$ git reset --hard
5
gavenkoa

_.gitattributes_設定は、新しいコミットにのみ影響します。このリポジトリにno履歴が公開されている(それに依存する他のリポジトリがない)場合、履歴全体を確認することができます。 Unix/Linuxでは、dos2unix(1)を使用してすべてのファイルをfind(1)と組み合わせて修正し、_filter-branch_の履歴書き換えを使用できます( discussion)を参照 git bookで)プロジェクトの全履歴をクリーンアップすることもできます。

新鮮なクローンで、細心の注意を払って使用してください。クローンを持っている可能性のあるanybodyと連絡を取り、やりたいことをアドバイスします。

4
vonbrand

.gitattributesの* text = autoオプションは、テキストとしてマークされているCRLF(Windows)行末のファイルが含まれている場合、Gitリポジトリを「不正な状態」のままにします( https://marc.info/ ?l = git&m = 154484903528621&w = 2 )。標準のrenormalizeオプションはLFSフィルターでは正しく機能しないため、他の回答の指示または https://help.github.com/en/articles/dealing-with-line-endings 、正しく動作しません。代わりに、これらの手順が機能しました。

状況:

  • Windows
  • Gitリポジトリには、CRおよびCRLFの両方の行末を持つファイルが含まれていました
  • * text = autoを.gitattributesに追加(したがって、Windowsでcore.crlf = autoを設定したユーザーに依存しません)
  • また、LFS追跡ファイルの-crlfを-textに変更しましたが、それが必要かどうかはわかりません。

    1. 行末の問題があるブランチから新しいブランチを作成します(コミットされていない変更がないことを前提とします):git checkout -b feature/doing-stuff-fix-eol
    2. .gitattributesからLFSフィルターを削除します(すべての「filter = lfs diff = lfs merge = lfs」を何も置き換えません)
    3. コミットとプッシュ:git commit -a -m「EOL修正のためにLFSフィルターを無効にする」
    4. 非gitフォルダーに移動
    5. LFSをグローバルにアンインストール:git lfs uninstall
    6. 新しいリポジトリクローンを作成します:git clone -b feature/doing-stuff-fix-eol [リモートリポジトリURL] fix-eol
    7. 行末を正規化します:git add --renormalize。 (すべてのファイルを再正規化するドットに注意してください)
    8. 正規化された正しいファイルのみを確認してください。通常、LFSによって処理されるファイルを含めないでください!
    9. コミットしてプッシュ(ハッシュを保存):git commit -m "行末を修正"
    10. 非gitフォルダーに移動
    11. LFSをグローバルにインストールします:git lfs install
    12. 元のリポジトリのクローンに移動してプル
    13. 元のブランチをチェックアウトする:git checkout feature/doing-stuff
    14. Cherryがeolの修正コミットとプッシュを選択:git cherry-pick [hash]
    15. Eolブランチを削除してプッシュ
    16. Eolリポジトリクローンを削除します(または、さらにブランチを修正する必要がある場合は保持します)。
0
Walter Laan