web-dev-qa-db-ja.com

^ Mを無視するためのgit-diff

一部のファイルで改行区切り文字として^ Mが含まれているプロジェクトで。 git-diffはそれをファイル全体が単一行であると見なすので、これらのファイルを比較することは明らかに不可能です。

前のバージョンとどう違うのですか?

「差分のときに^ Mを改行として扱う」のようなオプションはありますか?

Prompt> git-diff "HEAD^" -- MyFile.as 
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
Prompt>

更新:

今、私は最新の10のリビジョンをチェックアウトしてLFにCRを変換するスクリプトを書きました。

require 'fileutils'

if ARGV.size != 3
  puts "a git-path must be provided"
  puts "a filename must be provided"
  puts "a result-dir must be provided"
  puts "example:"
  puts "Ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"
  exit(1)
end

gitpath = ARGV[0]
filename = ARGV[1]
resultdir = ARGV[2]

unless FileTest.exist?(".git")
  puts "this command must be run in the same dir as where .git resides"
  exit(1)
end

if FileTest.exist?(resultdir)
  puts "the result dir must not exist"
  exit(1)
end
FileUtils.mkdir(resultdir)

10.times do |i|
  revision = "^" * i
  cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"
  puts cmd 
  system cmd
end
392
neoneye

GitHubは を提案して、gitで扱われるリポジトリでは改行文字として\ nのみを使用するようにすべきです。自動変換するオプションがあります:

$ git config --global core.autocrlf true

もちろん、これはcrをlfに変換すると言われていますが、crをlfに変換したいのです。私はこれがまだうまくいくことを願っています…

そしてファイルを変換します。

# Remove everything from the index
$ git rm --cached -r .

# Re-add all the deleted files to the index
# You should get lots of messages like: "warning: CRLF will be replaced by LF in <file>."
$ git diff --cached --name-only -z | xargs -0 git add

# Commit
$ git commit -m "Fix CRLF"

core.autocrlfは のmanページ に書かれています。

322
nes1983

git tfsを使用しているとき、Windowsで開発しているときにこの問題に遭遇しました。私はこのようにしてそれを解決しました:

git config --global core.whitespace cr-at-eol

これは基本的にGitに行末CRがエラーではないことを伝えます。その結果、これらの厄介な^M文字は、git diffgit showなどの行末に表示されなくなりました。

他の設定はそのままのように見えます。たとえば、行末に余分なスペースがあると、それでも差分として(赤で強調表示された)エラーとして表示されます。

(他の答えはこれをほのめかしていますが、上記はまさにその設定方法です。1つのプロジェクトだけに設定を設定するには、--globalを省略してください。)

EDIT

多くの行末調査の結果、.NETチームで次のような設定をしていたとき、私は最善を尽くしました。

  • NO core.eol設定
  • NO core.whitespace設定
  • NO core.autocrlf設定
  • Windows用のGitインストーラーを実行すると、次の3つの選択肢があります。
    • Windows形式のチェックアウト、Unix形式の行末のコミット< - これを選択
    • そのままチェックアウトし、Unixスタイルの行末をコミットする
    • そのままチェックアウト、そのままコミット

空白の設定を使用する必要がある場合、TFSと対話する必要がある場合は、プロジェクトごとにのみ有効にする必要があります。 --globalを省略するだけです。

git config core.whitespace cr-at-eol

Core。*設定を削除する必要がある場合、最も簡単な方法は次のコマンドを実行することです。

git config --global -e

これにより、グローバルな.gitconfigファイルがテキストエディタで開き、削除したい行を簡単に削除できます。 (または、コメントアウトするために「#」を前に付けることもできます。)

319
Ryan Lundy

git diff --ignore-space-at-eolgit diff --ignore-space-change、またはgit diff --ignore-all-spaceを試してください。

110
Jakub Narębski

また見なさい:

core.whitespace = cr-at-eol

または同等に、

[core]
    whitespace = cr-at-eol

whitespaceの前にはタブが付いています。

97

^Mでこれらのgit diffを取得するのはなぜですか?

私の場合、私はWindowsで開発されたプロジェクトに取り組んでいて、OS Xを使用しました。コードを変更すると、^Mで追加した行の最後にgit diffが表示されました。 ^Mは、ファイルの他の部分とは行末が異なるために表示されていたと思います。ファイルの残りの部分はWindowsで開発されたため、CR行末を使用し、OS XではLF行末を使用します。

どうやら、Windows開発者はGitのインストール中に「Checkout Windows-style、commit Unix-style line endings」オプションを使用しなかったようです。

では、これについてどうすればよいでしょうか?

Windowsユーザーにgitを再インストールさせ、「Checkout Windowsスタイル、commit Unixスタイルの行末」オプションを使用することができます。これは、Windowsを行末文字の例外と見なし、Windowsがこの方法で独自の問題を修正するためです。

ただし、このオプションを選択した場合は、現在のファイルを修正する必要があります(これらのファイルはまだCR行末を使用しているため)。次の手順に従ってこれを行いました。

  1. リポジトリからすべてのファイルを削除しますが、ファイルシステムからは削除しません。

    git rm --cached -r .
    
  2. 特定のファイルが行末としてLFを使用するように強制する.gitattributesファイルを追加します。これをファイルに入れます:

    *.ext text eol=crlf
    

    .extを、一致させるファイル拡張子に置き換えます。

  3. すべてのファイルを再度追加します。

    git add .
    

    これにより、次のようなメッセージが表示されます。

    warning: CRLF will be replaced by LF in <filename>.
    The file will have its original line endings in your working directory.
    
  4. チェックアウトWindowsスタイルを使用したくない頑固なWindowsユーザーがいない限り、.gitattributesファイルを削除できます。Unixスタイルの行末をコミットします」オプション。

  5. コミットしてすべてをプッシュします。

  6. 使用されているすべてのシステムで該当するファイルを削除してチェックアウトします。 Windowsシステムでは、「Checkout Windows-style、commit Unix-style line endings」オプションを使用していることを確認してください。また、これらのタスクを実行したシステムでこれを行う必要があります。これは、ファイルを追加したときにgitが言ったためです。

    The file will have its original line endings in your working directory.
    

    ファイルを削除するには、次のようなことを実行できます。

    git ls | grep ".ext$" | xargs rm -f
    

    そして、正しい行末でそれらを取り戻すためにこれ:

    git ls | grep ".ext$" | xargs git checkout
    

    もちろん、.extを必要な拡張子に置き換えます。

これで、プロジェクトは行末にLF文字のみを使用し、厄介なCR文字は戻ってきません:)。

もう1つのオプションは、Windowsスタイルの行末を強制することです。これには.gitattributesファイルを使用することもできます。

詳細: https://help.github.com/articles/dealing-with-line-endings/#platform-all

38
gitaarik

「差分のときに^ Mを改行として扱う」のようなオプションはありますか?

"diffname__"ファミリーのコマンドは行末でのキャリッジリターンの違いを無視することを学んだので、Git 2.16(Q1 2018)のものがあるでしょう。

Junio C Hamano(gitstername __) による commit e9282f0 (2017/10/26)を参照してください。
手助け: Johannes Schindelin(dschoname __)
commit 10f65c2Junio C Hamano - gitster - 、2017年11月27日にマージ)

diff:--ignore-cr-at-eol

新しいオプション--ignore-cr-at-eolは、(完全な)行の終わりでキャリッジリターンが存在しないかのように扱うようにdiff機構に指示します。

さまざまな空白の違いを無視するための他の "--ignore-*"オプションと同じように、これはあなたのエディタプログラムによる誤ったCRLF<->LF変換に惑わされることなくあなたが行った実際の変更をレビューするのを助けます。

23
VonC

TL; DR

ソースコードではなくcore.pager"tr -d '\r' | less -REX"に変更します

これが理由です

これらの厄介な^ Mは、色付けとページャの影響を受けています。 enter image description here デフォルトのgit pagerオプションであるless -Rが原因です。 (gitのデフォルトのページャは less -REX です)

最初に注意することは、 git diff -b は空白の変更を表示しないことです(例:\ r\n vs\n)

セットアップ:

git clone https://github.com/CipherShed/CipherShed
cd CipherShed

Unixファイルを作成して行末を変更する簡単なテストでは、git diff -bによる変更はありません。

echo -e 'The quick brown fox\njumped over the lazy\ndogs.' > test.txt
git add test.txt
unix2dos.exe test.txt
git diff -b test.txt

パイプをlessに強制しても^ Mは表示されませんが、colorとless -Rを有効にすると以下のようになります。

git diff Origin/v0.7.4.0 Origin/v0.7.4.1 | less
git -c color.ui=always diff Origin/v0.7.4.0 Origin/v0.7.4.1 | less -R

この修正は、パイプを使用して出力から\ r(^ M)を削除することによって示されます。

git diff Origin/v0.7.4.0 Origin/v0.7.4.1
git -c core.pager="tr -d '\r' | less -REX"  diff Origin/v0.7.4.0 Origin/v0.7.4.1

less -rを使用するのは賢明ではありません。カラーコードだけでなく、すべての制御コードを通過させるためです。

Git設定ファイルを直接編集したいだけなら、これがupdate/addのエントリになります。

[core]
        pager = tr -d '\\r' | less -REX
16
Jason Pyeron

私は長い間この問題に苦しんでいました。これまでのところ最も簡単な解決策は、^ M文字を気にせず、それらを処理できる視覚的な差分ツールを使用することです。

入力する代わりに、

git diff <commitHash> <filename>

試してみてください。

git difftool <commitHash> <filename>
13
Ian Wojtowicz

Eclipseを使用している場合は、File > Convert Line Delimiter To > Unix (LF, \n, 0A, ¶)を設定することで^Mgit diffから消すことができます。

0
Adil