"파일 끝에 새 줄 없음" 로그의 의미는 무엇입니까?
를 할때.git diff
파일 끝에 새 줄 없음이 표시됩니다.
그 메시지의 의미는 무엇이고 우리에게 무엇을 알려주려고 합니까?
줄이 은 줄이 없습니다).\n
파일 끝에 LF 또는 CRLF로 표시됩니다.
즉, 간단히 말해 파일의 마지막 바이트(또는 Windows(윈도우)인 경우 바이트)는 새 줄이 아닙니다.
그렇지 않으면 파일 끝에 새 줄이 있는 위치와 그렇지 않은 위치를 구분할 수 없기 때문에 메시지가 표시됩니다.Diff는 어쨌든 새 줄을 출력해야 합니다. 그렇지 않으면 결과를 자동으로 읽거나 처리하기가 더 어렵습니다.
새 줄은 파일 형식에서 허용되는 경우 항상 텍스트 파일의 마지막 문자로 입력하는 것이 좋습니다.또한, 예를 들어, C 및 C++ 헤더 파일의 경우 언어 표준에 의해 요구됩니다.
스타일이 나쁘기만 한 것이 아니라 파일의 다른 도구를 사용할 때 예기치 않은 동작이 발생할 수 있습니다.
여기 있습니다test.txt
:
first line
second line
마지막 줄에 새 줄 문자가 없습니다.파일에 몇 개의 행이 있는지 확인합니다.
$ wc -l test.txt
1 test.txt
원하는 것일 수도 있지만 대부분의 경우 파일에 두 줄이 있을 것으로 예상할 수 있습니다.
또한 파일을 결합하려는 경우 다음과 같이 작동하지 않을 수 있습니다.
$ cat test.txt test.txt
first line
second linefirst line
second line
마지막으로, 만약 당신이 새로운 선을 추가한다면 당신의 디프가 약간 더 시끄러울 것입니다.세 번째 줄을 추가한 경우 두 번째 줄에 대한 편집 내용과 새 추가 내용이 표시됩니다.
기존 파일의 끝에 새 텍스트 줄을 추가하는 경우, 이 텍스트 줄은 아직 다음과 같습니다.newline character
마지막에, diff는 개념적으로는 그렇지 않았지만 이전의 마지막 줄이 수정된 것으로 표시됩니다.
이것이 적어도 하나의 좋은 이유입니다.newline character
마지막에
예
파일에 포함되는 내용이 포함됩니다.
A() {
// do something
}
16진수 덤프:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
이제 편집 대상
A() {
// do something
}
// Useful comment
16진수 덤프:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d0a 2f2f 2055 something.}.// U
00000020: 7365 6675 6c20 636f 6d6d 656e 742e 0a seful comment..
Git diff는 다음을 표시합니다.
-}
\ No newline at end of file
+}
+// Useful comment.
즉, 개념적으로 발생한 것보다 더 큰 차이를 보여줍니다.이 라인을 했다는 것을 .}
그리고 라인을 추가했습니다.}\n
이것은 사실 일어난 일이지만 개념적으로 일어난 일이 아니기 때문에 혼란스러울 수 있습니다.
유일한 이유는 유닉스가 역사적으로 사람이 읽을 수 있는 모든 텍스트 파일이 새 줄로 끝나는 관습을 가지고 있었기 때문입니다.그 당시에는 텍스트 파일을 표시하거나 결합할 때 추가 처리를 피하고 텍스트 파일을 다른 종류의 데이터(예: 사람이 읽을 수 없는 원시 이진 데이터)를 포함하는 파일과 다르게 처리하는 것을 피했습니다.
이러한 관례 때문에, 그 시대의 많은 도구들은 텍스트 편집기, 디파잉 도구 및 기타 텍스트 처리 도구를 포함하여 새로운 마지막 줄을 기대합니다.Mac OS X는 BSD Unix를 기반으로 구축되었으며 Linux는 Unix와 호환되도록 개발되었으므로 두 운영 체제는 동일한 규약, 동작 및 도구를 상속받았습니다.
Windows는 Unix와 호환되도록 개발되지 않았기 때문에 동일한 규약을 사용하지 않으며 대부분의 Windows 소프트웨어는 뒤에 이어지는 새 줄이 없어도 문제가 없습니다.
그러나 Git는 Linux용으로 먼저 개발되었으며 많은 오픈 소스 소프트웨어가 Linux, Mac OS X, FreeBSD 등과 같은 유닉스 호환 시스템을 기반으로 구축되었기 때문에 대부분의 오픈 소스 커뮤니티와 도구(프로그래밍 언어 포함)는 이러한 관례를 계속 따르고 있습니다.
1971년에는 기술적인 이유가 있었지만, 이 시대에는 대부분 기존 툴과의 호환성을 유지하고 기존 툴과의 호환성을 유지하는 것입니다.
파일의 끝에 새 줄이 없다는 것을 나타냅니다.대참사가 아니라 지휘 라인에 차이가 있을 때는 없다는 것을 분명히 하라는 메시지일 뿐입니다.
이 규칙이 실행된 이유는 유닉스 계열 운영 체제에서 새로운 줄 문자가 줄 종단기 및/또는 메시지 경계로 취급되기 때문입니다(여기에는 프로세스 간 배관, 줄 버퍼링 등이 포함됨).
예를 들어, 줄 바꿈 문자만 있는 파일은 빈 줄 하나로 처리됩니다.반대로, 길이가 0바이트인 파일은 실제로 행이 0인 빈 파일입니다.은 이는다에수있확다니습에 할 수 .wc -l
지휘권
전체적으로, 이 동작은 다음과 같은 경우 빈 텍스트 파일과 빈 줄이 하나인 텍스트 파일을 구별할 수 있는 다른 방법이 없기 때문에 합리적입니다.\n
문자는 줄 구분 기호가 아니라 줄 구분 기호에 불과했습니다.따라서 유효한 텍스트 파일은 항상 줄 바꿈 문자로 끝나야 합니다.유일한 예외는 텍스트 파일이 비어 있는 경우(줄 없음)입니다.
이전 답변에서 보이지 않는 것이 하나 있습니다.파일의 일부가 잘린 경우 줄 바꿈 없음에 대한 경고가 발생할 수 있습니다.데이터가 누락된 증상일 수 있습니다.
핵심 문제는 사용자가 선을 정의하는 것과 온라인 문자 시퀀스가 선의 일부인지 여부입니다.UNIX 기반 편집기(예: VIM) 또는 도구(예: Git)는 EOL 문자 시퀀스를 줄바꿈 문자로 사용하므로 줄의 일부입니다.C와 Pascal에서 세미콜론(;)을 사용하는 것과 비슷합니다.C 세미콜론에서는 문을 종료하고 Pascal에서는 문을 구분합니다.
이렇게 하면 줄 끝이 파일을 변경하지 않고 자동으로 수정되므로 실제로 문제가 발생합니다.해결 방법은 이 게시물을 참조하십시오.
소스 파일은 종종 도구(C, C++: 헤더 파일, Javascript: 번들러)에 의해 연결됩니다.새 줄 문자를 생략하면 불쾌한 버그가 발생할 수 있습니다(한 소스의 마지막 줄이 다음 소스 파일의 첫 번째 줄과 연결되는 경우).모든 소스 코드 콘캣 도구가 연결된 파일 사이에 새 줄을 삽입하기를 바라지만 항상 그런 것은 아닌 것 같습니다.
문제의 핵심은 대부분의 언어에서 새 줄은 의미론적 의미를 가지며 파일의 끝은 새 줄 문자에 대한 언어 정의 대안이 아니라는 것입니다.따라서 마지막 문자를 포함하여 모든 문/식을 줄 바꿈 문자로 종료해야 합니다.
원래 파일에 새 줄 문자가 없을 수 있습니다.
그러나 리눅스의 gedit 같은 일부 편집기는 파일 끝에 새 줄을 자동으로 추가합니다.이런 종류의 편집기를 사용하는 동안에는 이 메시지를 삭제할 수 없습니다.
이 문제를 극복하기 위해 노력한 것은 비주얼 스튜디오 코드 편집기로 파일을 여는 것입니다.
이 편집기는 마지막 줄을 명확하게 보여주며 원하는 대로 줄을 삭제할 수 있습니다.
ubuntu$> vi source.cpp
:set binary noeol
무엇을
Git Diff를 수행할 때 "파일 끝에 새 줄 없음"이라고 표시됩니다.
어떤 면에서는 그렇습니다. 하지만 그것은 더 섬세하고 미묘합니다.
Git diff를 수행할 때 Git은 파일 버전 간의 차이를 보여주며, 파일이 서로 다른 청크로 표시됩니다.여기에는 파일 끝에 청크가 포함될 수 있습니다.
파일의 두 버전이 모두 새 줄로 끝나지 않으면 청크의 끝이 읽힙니다.
\ No newline at the end of file
반면에 한 버전만 새 줄로 끝나지 않으면 청크는 다음 중 하나로 끝납니다.
-last line
\ No newline at the end of file
+new last line
또는
-last line
+new last line
\ No newline at the end of file
왜요?
메시지의 의미는 무엇입니까?
그 이유는 간단하다.의 주요 목적 중 하나는git diff
변경 사항을 명확하게 표시하여 입력으로 사용할 수 있도록 합니다.git apply
이를 위해 Git는 diff를 적용할 때 새 줄과 어떤 관계가 있는지 알아야 합니다.제거, 보관 또는 변경해야 합니까?
그\ No newline at the end of file
그것을 하는 방법입니다.새 줄이 있는 경우와 없는 경우가 파일에 중요하기 때문에 이러한 변경 사항을 알고 싶어하는 사람에게도 도움이 됩니다.
그리고 그것이 우리에게 말하려고 하는 것은 무엇입니까?
음, 이 파일의 끝에 새 줄이 없다는 것뿐입니다.또는 없었으나 지금은 존재합니다.또는 있었지만 지금은 그렇지 않습니다.
언급URL : https://stackoverflow.com/questions/5813311/whats-the-significance-of-the-no-newline-at-end-of-file-log
'programing' 카테고리의 다른 글
gitlab에서 권한을 가져오는 중 거부됨(공개 키) (0) | 2023.05.29 |
---|---|
.NET 어셈블리에 대한 CLS 준수 설정 (0) | 2023.05.29 |
PostgreSQL에서 트리거를 일시적으로 비활성화하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
저는 두 개의 수업을 "싸울" 수 있는 프로그램을 만들었습니다.어떤 이유에서든 C#이 항상 승리합니다.VB.NET에 무슨 문제가 있나요? (0) | 2023.05.29 |
MongoDB 노드는 결과를 처리하지 않는 방법을 찾으십니까? (0) | 2023.05.29 |