一部のファイルで改行区切り文字として^ 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
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ページ に書かれています。
git tfs
を使用しているとき、Windowsで開発しているときにこの問題に遭遇しました。私はこのようにしてそれを解決しました:
git config --global core.whitespace cr-at-eol
これは基本的にGitに行末CRがエラーではないことを伝えます。その結果、これらの厄介な^M
文字は、git diff
、git show
などの行末に表示されなくなりました。
他の設定はそのままのように見えます。たとえば、行末に余分なスペースがあると、それでも差分として(赤で強調表示された)エラーとして表示されます。
(他の答えはこれをほのめかしていますが、上記はまさにその設定方法です。1つのプロジェクトだけに設定を設定するには、--global
を省略してください。)
EDIT:
多くの行末調査の結果、.NETチームで次のような設定をしていたとき、私は最善を尽くしました。
空白の設定を使用する必要がある場合、TFSと対話する必要がある場合は、プロジェクトごとにのみ有効にする必要があります。 --global
を省略するだけです。
git config core.whitespace cr-at-eol
Core。*設定を削除する必要がある場合、最も簡単な方法は次のコマンドを実行することです。
git config --global -e
これにより、グローバルな.gitconfigファイルがテキストエディタで開き、削除したい行を簡単に削除できます。 (または、コメントアウトするために「#」を前に付けることもできます。)
git diff --ignore-space-at-eol
、git diff --ignore-space-change
、またはgit diff --ignore-all-space
を試してください。
また見なさい:
core.whitespace = cr-at-eol
または同等に、
[core]
whitespace = cr-at-eol
whitespace
の前にはタブが付いています。
^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
行末を使用しているため)。次の手順に従ってこれを行いました。
リポジトリからすべてのファイルを削除しますが、ファイルシステムからは削除しません。
git rm --cached -r .
特定のファイルが行末としてLF
を使用するように強制する.gitattributes
ファイルを追加します。これをファイルに入れます:
*.ext text eol=crlf
.ext
を、一致させるファイル拡張子に置き換えます。
すべてのファイルを再度追加します。
git add .
これにより、次のようなメッセージが表示されます。
warning: CRLF will be replaced by LF in <filename>.
The file will have its original line endings in your working directory.
「チェックアウトWindowsスタイルを使用したくない頑固なWindowsユーザーがいない限り、.gitattributes
ファイルを削除できます。Unixスタイルの行末をコミットします」オプション。
コミットしてすべてをプッシュします。
使用されているすべてのシステムで該当するファイルを削除してチェックアウトします。 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
「差分のときに^ Mを改行として扱う」のようなオプションはありますか?
"diff
name__"ファミリーのコマンドは行末でのキャリッジリターンの違いを無視することを学んだので、Git 2.16(Q1 2018)のものがあるでしょう。
Junio C Hamano(gitster
name __) による commit e9282f0 (2017/10/26)を参照してください。
手助け: Johannes Schindelin(dscho
name __) 。
( commit 10f65c2 の Junio C Hamano - gitster
- 、2017年11月27日にマージ)
diff:
--ignore-cr-at-eol
新しいオプション
--ignore-cr-at-eol
は、(完全な)行の終わりでキャリッジリターンが存在しないかのように扱うようにdiff機構に指示します。さまざまな空白の違いを無視するための他の "
--ignore-*
"オプションと同じように、これはあなたのエディタプログラムによる誤ったCRLF<->LF
変換に惑わされることなくあなたが行った実際の変更をレビューするのを助けます。
TL; DR
ソースコードではなくcore.pager
を"tr -d '\r' | less -REX"
に変更します
これが理由です
これらの厄介な^ Mは、色付けとページャの影響を受けています。 デフォルトの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
私は長い間この問題に苦しんでいました。これまでのところ最も簡単な解決策は、^ M文字を気にせず、それらを処理できる視覚的な差分ツールを使用することです。
入力する代わりに、
git diff <commitHash> <filename>
試してみてください。
git difftool <commitHash> <filename>
Eclipseを使用している場合は、File > Convert Line Delimiter To > Unix (LF, \n, 0A, ¶)
を設定することで^M
をgit diff
から消すことができます。