94

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

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

どうすればgitにファイルの作業コピーを正規化させることができますか?できれば、gitで作業ツリー全体を正規化したいと思います。

4

7 に答える 7

119

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から直接出ています。古いバージョンの場合、ドキュメント (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

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

于 2013-03-26T20:30:33.647 に答える
106

Gitクライアント2.16以降では、これを行うためのはるかに簡単な方法があります。使用するだけです:

git add --renormalize .

注:これは、クリーンなワークスペースで行うことをお勧めします。詳細については、以下を参照してください。

于 2018-06-01T13:54:56.793 に答える
11

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

リポジトリに保留中の変更がないことを確認してください。

$ git status
$ git stash

CRLF.gitattributesの解釈が変更されるように変更します。

$ 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
于 2017-08-07T12:11:40.210 に答える
4

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

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

于 2013-03-26T19:42:48.137 に答える
2

.gitattributesの*text= autoオプションは、テキストとしてマークされたCRLF(Windows)行末のファイルが含まれている場合、Gitリポジトリを「不正な状態」のままにします(https://marc.info/?l=git&mを参照) = 154484903528621&w = 2)。標準の再正規化オプションは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 [remote repository url] fix-eol
    7. 行末を正規化します:gitadd--renormalize。(すべてのファイルを再正規化するためのドットに注意してください)
    8. 正規化された正しいファイルのみを確認してください。通常LFSで処理されるファイルは含めないでください。
    9. コミットしてプッシュ(ハッシュを保存):git commit-m"行末を修正"
    10. 非gitフォルダーに移動します
    11. LFSをグローバルにインストールする:git lfs install
    12. 元のリポジトリのクローンに移動してプル
    13. 元のブランチをチェックアウトする:git checkout feature /doing-stuff
    14. チェリーは、eol修正コミットを選択してプッシュします。gitcherry-pick[ハッシュ]
    15. eolブランチを削除してプッシュ
    16. eolリポジトリのクローンを削除します(または、さらにブランチを修正する必要がある場合はそのままにしておきます)
于 2019-06-28T11:02:23.870 に答える
0

merge.renormalize構成設定が役立つ場合があります。

于 2020-06-01T03:25:01.790 に答える
0

このフラグを使用してリポジトリのクローンを再作成する-c core.autocrlf=false必要がありましたが、他の構成は必要ありませんでした。

このような:

git clone -c core.autocrlf=false https://github.com/any-repo.git

私たちのプロジェクトは当初、MacではLFで作成されていましたが、Windowsでは自動的にCRLFに変換されました。eslintを使用し、再クローンを作成するまで、コードのすべての行に下線を付けました。

于 2022-02-21T18:09:36.690 に答える