^ M을 무시하는 git-diff provided” puts “a filename

파일의 일부가 개행 구분자로 ^ 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 개정판을 확인하고 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-handled repos에서 \ n을 개행 문자로만 사용해야한다고 제안 합니다. 자동 변환하는 옵션이있다 :

$ git config --global core.autocrlf true

물론 이것은 crlf를 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는 매뉴얼 페이지 에 설명되어 있습니다.


답변

Windows에서 개발할 때을 사용할 때이 문제가 발생했습니다 git tfs. 나는 이것을 이렇게 해결했다.

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

이것은 기본적으로 줄 끝 CR이 오류가 아니라고 Git에 알려줍니다. 그 결과, 그 성가신 ^M문자는 더 이상의 행의 끝 부분에 표시되지 않습니다 git diff, git show

다른 설정은 그대로 둡니다. 예를 들어, 줄 끝의 추가 공백은 여전히 ​​diff에서 오류로 표시됩니다 (빨간색으로 강조 표시됨).

(다른 답변이 언급하지만, 위의 설정을 설정하는 방법을 정확하게있다. 하나 개의 프로젝트에 대한 설정을 설정하려면 생략 --global.)

편집 :

많은 줄 끝 난통 후 .NET 팀에서 다음 설정으로 작업 할 때 가장 운이 좋았습니다.

  • 코어가 없습니다.
  • 코어 없음 공백 설정
  • 코어 없음 자동 crlf 설정
  • Windows 용 Git 설치 프로그램을 실행하면 다음 세 가지 옵션이 제공됩니다.
    • Windows 스타일 체크 아웃, 유닉스 스타일 줄 바꿈 <-이 중 하나를 선택하십시오
    • 그대로 체크 아웃, 유닉스 스타일의 결말 커밋
    • 있는 그대로 체크 아웃하고있는 그대로 커밋

공백 설정을 사용해야하는 경우 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 ending ” 옵션을 사용하지 않았습니다 .

그래서 우리는 이것에 대해 어떻게해야합니까?

당신은 Windows 사용자는 “자식을 다시 설치하고 사용할 수 있습니다 , 유닉스 스타일의 라인 엔딩을 커밋 체크 아웃 윈도우 스타일 옵션을”. Windows를 줄 끝 문자에서 예외로보고 Windows 가이 방법으로 자체 문제를 해결하기 때문에 이것이 내가 선호하는 것입니다.

이 옵션을 사용하면 CR줄 끝을 사용하고 있기 때문에 현재 파일을 수정해야합니다 . 다음 단계에 따라이 작업을 수행했습니다.

  1. 파일 시스템이 아닌 저장소에서 모든 파일을 제거하십시오.

    git rm --cached -r .
    
  2. .gitattributes특정 파일을 LF줄 끝 으로 사용하도록하는 파일을 추가하십시오 . 이것을 파일에 넣으십시오.

    *.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. .gitattributesWindows 스타일 체크 아웃, Unix 스타일 행 끝 커밋 “옵션 을 사용하지 않으려는 완고한 Windows 사용자가 없으면 파일을 제거 할 수 있습니다.

  5. 커밋하고 모두 밀어 넣으십시오.

  6. 사용 된 모든 시스템에서 해당 파일을 제거하고 체크 아웃하십시오. Windows 시스템에서 이제 ” Checkout Windows 스타일, commit Unix 스타일 줄 끝 “옵션을 사용해야합니다 . 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문자는 다시 나타나지 않습니다. :).

다른 옵션은 창 스타일 줄 끝을 적용하는 것입니다. .gitattributes이 파일을 사용할 수도 있습니다 .

자세한 정보 :
https://help.github.com/articles/dealing-with-line-endings/#platform-all


답변

“확산시 ^ M을 줄 바꿈으로 처리”와 같은 옵션이 있습니까?

diff“명령 군이 줄 끝에서 캐리지 리턴의 차이를 무시하는 법을 배웠기 때문에 Git 2.16 (2018 년 1 분기)이있는 것이있을 것 입니다.

참조 e9282f0 커밋 에 의해 (2017년 10월 26일)를 Junio C 하마노 ( gitster) .
도움 : Johannes Schindelin ( dscho) .
( Junio ​​C gitsterHamano 에 의해 병합 커밋 10f65c2 , 2017 년 11 월 27 일)

차이점 : --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

유닉스 파일을 만들고 줄 끝을 변경하는 빠른 테스트는 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

파이프를 줄이면 강제로 ^ M이 표시되지 않지만 색상을 활성화하고 다음을 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 config 파일을 직접 편집하려면 다음을 업데이트 / 추가해야합니다.

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