1. ホーム
  2. git

[解決済み] git-diff で ^M を無視するようにした

2022-03-17 18:04:52

質問

あるプロジェクトで、いくつかのファイルに改行記号として ^M が含まれています。git-diffではファイル全体が一行に見えるため、これらのファイルを差分することは明らかに不可能です。

旧バージョンとの差分はどのように取るのですか?

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>


UPDATE

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

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に変換したいのに対して、crlfを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は、以下のページで説明されています。 マニュアルページ .