git EOL変換を無効にする


100

私はgitがどの操作でも行末を変更しないようにしています。残念ながら、それはどうでもいいようです。私はそれを次のテストケースに減らしました。テストケースには、この動作を無効にするためのさまざまなメカニズムがありました。


  • 2台のマシンから始めます(Windowsコンピューター= A、Linuxコンピューター= B)
  • 両方のマシンで: git config --global core.autocrlf false
  • 両方のマシン:(git config --global core.eol crlf念のため)

  • Aに新しいリポジトリを作成します。空のフォルダから:
    • git init --shared(その後、作成した.gitディレクトリを再表示します)
    • .gitignoreリポジトリに新しいファイルを作成する
    • .gitattributes1行でリポジトリに新しいファイルを作成します。* -text
    • git add .、それからgit commit -m "initial commit"回避するために、例えばこれ
    • git branch master_recv
    • リモコンを追加
  • document.txtCRLFを含むリポジトリに新しいファイルを作成する
  • コミット:git add -A、次にgit commit -m "<something>"
  • Aにはdocument.txtまだCRLFが含まれていることに注意してください(それを削除してからリセットすると--hard、CRLFが残っているバージョンが返されます)。

  • ディレクトリ全体をコンピュータBにSCP
  • 新しいファイルを追加 new fileCRLFを含むを
  • コミット:git add -A、次にgit commit -m "<something>"
  • B document.txtとBのnew file両方にまだCRLFが含まれていることに注意してください

  • BのマスターをAにプルします。 git pull <remote> master:master_recv
  • A document.txtはLFに変更されました。追加されたファイルnew fileにはLFも含まれます。

BがWindowsマシンの場合、問題は発生しません。


core.autocrlf 、常に falseをされていますか?\nリポジトリにすでに行末があるようですね?リポジトリを作業ディレクトリに変更する設定はありません\n\r\n
エドワードトムソン

常に設定されているわけではありません(たとえば、最初にリポジトリが作成されたときなど)。ただし、すでにリポジトリのCRで終わる行はありません。また、変更を加えたくありません。
イマレット2014

私はあなたのセットアップあなたの行末をCRLFとして保存するべきであるのでお願いします。私の(確かにおそらく迷惑な)教育のために、オブジェクトIDを付けてリポジトリにファイルを投稿できますか?
エドワードトムソン

@EdwardThomsonどういう意味ですか?リポジトリは公開されていません(Linuxマシンは公開されていないため)。サンプルファイルが必要だと仮定します。編集を参照してください。
イマレット2014

はい、そのファイルにはCRLF行末があることに同意します。あなたは「Windowsマシンの改行がCRに変わる!」と述べました。確かにそれはタイプミスでしたか、それとも本当にMac OS 9スタイルのキャリッジリターンラインエンディングを取得していますか?
エドワードトムソン

回答:


74

プロジェクト内には.gitattributesファイルが必要です。ほとんどの場合、以下のようになります(またはこのスクリーンショット)。

# Handle line endings automatically for files detected as text 
# and leave all files detected as binary untouched.
* text=auto

# Never modify line endings of our bash scripts
*.sh -crlf

#
# The above will handle all files NOT found below
#
# These files are text and should be normalized (Convert crlf => lf)
*.css           text
*.html          text
*.java          text
*.js            text
*.json          text
*.properties    text
*.txt           text
*.xml           text

# These files are binary and should be left untouched
# (binary is macro for -text -diff)
*.class         binary
*.jar           binary
*.gif           binary
*.jpg           binary
*.png           binary

自動処理を無効にする* text=autoよう* text=falseに変更します(スクリーンショットを参照)。

このような:

ここに画像の説明を入力してください

プロジェクトに.gitattributesファイルがない場合、行末はgit構成によって設定されます。git設定を変更するには、次のようにします。

次のディレクトリにある構成ファイルに移動します。

1)C:\ ProgramData \ Git \ config

2)Notepad ++(または任意のテキストエディター)で構成ファイルを開きます。

3)「autocrlf =」をfalseに変更します。

ここに画像の説明を入力してください


31
コードタグの代わりに画像を使用する理由 非常に不便
クリント

31
なぜなら、写真に大きな赤いボックスを追加して、目立たせることができるからです。
Gene

21
を使用* text=falseしてもテキストの設定は解除されません。テキストは文字列値falseに設定されたままになります。これは、テキストを未指定のままにする(特に未設定ではない)のと同じ効果があります。を使用* -textすると、特別な未設定の設定になります。パスのテキスト属性の設定を解除すると、gitはチェックインまたはチェックアウト時に行末変換を行わないようになります。
JustAMartin 2018年

この回答をありがとう@Gene。これは一日中私を夢中にさせてきました、そしてこれは私のためにそれを解決しました!
LeopardSkinPillBoxHat 2018年

7
この回答に感謝することはできません。誰かが誤解を招くようなアドバイスに従ったことを知るのに半日かかりました。@JustAMartinが指摘したよう* text=falseに、効果はありません。答えを直してください!
ポールB.

47

簡単な解決策の1つは次のとおりです。

  • すべてのリポジトリでcore.autocrlfがfalseに設定されていることを確認します。
    git config --global core.autocrlf false
  • リポジトリのクローンを再作成し、EOL変換が行われていないことを確認します。
  • または、Git 2.16(2018年第1四半期)以降、現在のリポジトリを保持し、git add --renormalize .

自動的に行われる変換がある場合、それは.gitattributes core.eolディレクティブがリポジトリ内にあることを意味します。

Gitの2.8+(2016年3月)のEOL変換はと残っている場合は、チェックします。

git ls-files --eol

2
autocrlf今日は使用しないでください!unsettedはとautocrlf同等falseです。Gitの流行の動きに遅れをとった
レイジーバジャー

1
上記のように、(グローバルフラグではなく)これを試してみましたが、機能しませんでした。gitバージョンは1.8.5.2です。
イマレット2014

@IanMallett「この時点で、LinuxマシンにはまだCRLFがあるようです」:コンテンツを再正規化するか、それを複製する(Windowsで行ったように)まで
VonC

11

私はそれを考え出した。SCPプログラムが行末を変換していたようです。LFで終わるファイルを意図的に作成し、ダウンロード時にCRLFとして表示されることを確認したところ、このことに気付きました。

これが私にとっての解決策だったので、私はこの答えを受け入れますが、将来の人々は、より一般的な解決策のために他の答えも参照する必要があります。


1
私の答えよりも具体的です。+1
VonC 2014

4

gitattributes(5)マニュアルページ「エフェクト」トピック

text

この属性は、行末の正規化を有効にして制御します。テキストファイルが正規化されると、その行末はリポジトリでLFに変換されます。作業ディレクトリで使用される行末スタイルを制御するeolには、単一ファイルの属性core.eol とすべてのテキストファイルの構成変数を使用します。

Set

パスにテキスト属性を設定すると、行末の正規化が有効になり、パスがテキストファイルとしてマークされます。コンテンツタイプを推測することなく、行末変換が行われます。

Unset パスのテキスト属性の設定を解除すると、Gitはチェックインまたはチェックアウト時に行末変換を行わないようになります。

core.autocrlf新しい(1.7.2+)Gitを使用せず、core.eolより信頼できる方法と見なされるテキスト属性の正しい設定解除|


.gitattributes、ファイル、でも、私は右のテキストとして明示的に無効にすべてを持っていましたか?また、変換を行わないようにするオプションが表示されません(crlf効果がないかもしれませんが)?
イマレット2014

6
しばしば混乱してしまう重要なこと-未設定にtextし、任意の変換を防ぐためには、あなたがに.gitattributesを設定しなければならない* -text し、しないように* text=falsefalsetext属性の有効な値ではありません-gitはそれを認識せず、代わりにデフォルトのautocrlf設定にフォールバックします。また、text値を変更した後、ローカルリポジトリからすべてのファイルをバックアップし、コミットしてから、必要に応じて正しい行末でファイルを復元し、コミットする必要があります。その後、行末はgitによって二度と変更されません。
JustAMartin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.