소개
이 랩에서는 Git 이 파일을 바이너리 파일로 간주하는지 여부를 확인하는 방법을 배우게 됩니다. 두 가지 방법을 살펴볼 것입니다. 하나는 git diff --numstat 명령을 사용하여 Git 이 변경 사항을 요약하는 방식을 관찰하는 것이고, 다른 하나는 표준 Linux file 명령을 사용하여 파일 유형을 식별하는 것입니다. 이 랩을 마치면 Git 이 텍스트 파일과 바이너리 파일을 어떻게 구분하는지, 그리고 이 구분을 직접 확인하는 방법을 이해하게 될 것입니다.
git diff --numstat 을 사용하여 확인
이 단계에서는 git diff --numstat을 사용하여 파일의 서로 다른 버전 간의 변경 사항을 이해하는 방법을 살펴봅니다. 이 명령은 각 파일에 대해 추가 및 삭제된 줄 수를 보여주는 변경 사항 요약을 제공합니다.
먼저, 프로젝트 디렉토리에 있는지 확인해 보겠습니다. 터미널을 열고 my-time-machine 디렉토리로 이동합니다.
cd ~/project/my-time-machine
이제 message.txt 파일을 변경해 보겠습니다. 새 줄을 추가합니다.
echo "Hello, Past Me" >> message.txt
>> 연산자는 텍스트를 덮어쓰는 대신 기존 파일에 추가합니다.
저장소의 상태를 다시 확인해 보겠습니다.
git status
message.txt가 수정되었음을 확인할 수 있습니다.
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: message.txt
no changes added to commit but untracked files present (use "git add" to track)
이제 git diff --numstat을 사용하여 변경 사항의 요약을 확인해 보겠습니다.
git diff --numstat
출력은 다음과 유사해야 합니다.
1 0 message.txt
이 출력은 message.txt에서 1 줄이 추가되고 0 줄이 삭제되었음을 알려줍니다. 여러 파일에서 변경 사항의 전체적인 영향을 간결하게 확인할 수 있는 방법입니다.
git diff --numstat을 이해하는 것은 변경 사항의 정확한 내용을 보지 않고 파일이 얼마나 변경되었는지 빠르게 파악하려는 경우에 유용합니다. 다른 사람이 만든 변경 사항을 검토하거나 자신의 작업에서 수정 사항의 규모를 확인하려는 경우 특히 유용합니다.
파일에 file 명령어 실행
이 단계에서는 파일의 유형을 알려주는 Linux 의 유용한 도구인 file 명령에 대해 배우게 됩니다. Git 이 텍스트 파일과 바이너리 파일을 다르게 처리하기 때문에 이는 중요합니다.
먼저, 프로젝트 디렉토리에 있는지 확인합니다.
cd ~/project/my-time-machine
이제 message.txt 파일에 file 명령을 사용해 보겠습니다.
file message.txt
다음과 유사한 출력을 볼 수 있습니다.
message.txt: ASCII text
이는 message.txt가 텍스트 파일임을 알려줍니다. Git 은 줄 단위 변경 사항을 쉽게 추적할 수 있기 때문에 텍스트 파일과 매우 잘 작동하도록 설계되었습니다.
다른 유형의 파일은 어떻습니까? 간단한 바이너리 파일을 만들어 보겠습니다. head 명령을 사용하여 시스템 파일의 처음 몇 바이트를 가져와 프로젝트의 새 파일로 리디렉션할 수 있습니다. 예를 들어, /bin/ls 실행 파일에서 작은 "바이너리" 파일을 만들어 보겠습니다.
head -c 1024 /bin/ls > binary_file
이 명령은 /bin/ls 파일의 처음 1024 바이트를 가져와 현재 디렉토리에 binary_file로 저장합니다.
이제 이 새 파일에 file 명령을 사용해 보겠습니다.
file binary_file
출력은 다를 것이며, 바이너리 파일임을 나타냅니다. 다음과 유사할 수 있습니다.
binary_file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, BuildID[sha1]=..., stripped
이 출력은 binary_file이 단순한 텍스트 파일이 아님을 확인합니다. Git 은 줄 단위 변경 사항을 쉽게 결정할 수 없기 때문에 바이너리 파일을 다르게 처리합니다. 대신, 일반적으로 각 버전의 전체 바이너리 파일을 저장합니다.
Git 으로 작업할 때, 특히 이미지, 컴파일된 프로그램 또는 압축된 아카이브와 같은 파일을 다룰 때 텍스트 파일과 바이너리 파일의 차이점을 이해하는 것이 중요합니다. Git 의 강력한 diffing 및 병합 기능은 주로 텍스트 파일을 위해 설계되었습니다.
텍스트 파일 vs 바이너리 파일 테스트
이 단계에서는 Git 이 텍스트 파일과 바이너리 파일의 변경 사항을 어떻게 처리하는지 살펴봅니다. 이를 통해 Git 의 diffing 기능이 주로 텍스트를 위해 설계된 이유를 강조할 것입니다.
먼저, 프로젝트 디렉토리에 있는지 확인합니다.
cd ~/project/my-time-machine
우리는 이미 message.txt (텍스트 파일) 와 binary_file을 가지고 있습니다. message.txt를 다시 변경해 보겠습니다.
echo "Another line for the future" >> message.txt
이제 두 파일을 스테이징 영역에 추가하고 커밋해 보겠습니다. 먼저 파일을 추가합니다.
git add message.txt binary_file
상태를 확인하여 두 파일이 스테이징되었는지 확인합니다.
git status
"Changes to be committed" 아래에 두 파일이 나열되어 있는 것을 볼 수 있습니다.
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: message.txt
new file: binary_file
이제 이러한 변경 사항을 커밋해 보겠습니다.
git commit -m "Add binary file and update message"
두 파일에 대한 변경 사항을 포함하여 커밋을 확인하는 출력을 볼 수 있습니다.
[master ...] Add binary file and update message
2 files changed, 2 insertions(+)
create mode 100644 binary_file
이제 binary_file을 약간 변경해 보겠습니다. 단일 바이트를 추가할 수 있습니다.
echo -n "a" >> binary_file
-n 플래그는 echo가 줄 바꿈 문자를 추가하는 것을 방지합니다.
상태를 다시 확인합니다.
git status
Git 은 binary_file이 수정되었음을 표시합니다.
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: binary_file
no changes added to commit but untracked files present (use "git add" to track)
이제 git diff를 사용하여 차이점을 확인해 보겠습니다.
git diff
Git 은 줄 단위 변경 사항을 표시하는 대신, 바이너리 파일이 다르다고 알려줄 것입니다.
warning: LF will be replaced by CRLF in binary_file.
The file has no newline at the end of the file.
diff --git a/binary_file b/binary_file
index ... ...
Binary files a/binary_file and b/binary_file differ
이 출력은 Git 이 바이너리 파일 내의 자세한 변경 사항을 표시하려고 시도하지 않음을 명확하게 보여줍니다. 단순히 파일이 다르다고 명시합니다. 이것은 Git 이 텍스트 파일과 바이너리 파일을 처리하는 방식의 주요 차이점입니다. 텍스트 파일의 경우 Git 은 정확히 어떤 줄이 추가, 제거 또는 수정되었는지 보여줄 수 있습니다. 바이너리 파일의 경우 변경이 발생했음을 알 수 있습니다.
이 단계는 Git 의 강력한 diffing 및 병합 도구가 소스 코드 및 구성 파일에서 흔히 사용되는 텍스트 기반 콘텐츠에 가장 효과적인 이유를 보여줍니다.
요약
이 랩에서는 Git 에서 파일이 바이너리인지 확인하는 방법을 배웠습니다. 두 가지 주요 방법을 탐구했습니다. 먼저, git diff --numstat 명령을 사용하여 파일 버전 간의 변경 사항을 검토하고, 추가 및 삭제 사항을 요약하는 방식을 관찰했습니다. 이는 변경 규모를 기반으로 파일의 특성을 간접적으로 나타낼 수 있습니다.
둘째, 표준 Linux 유틸리티인 file 명령에 대해 배우고, 이를 사용하여 파일의 유형을 직접 식별하여 텍스트 형식과 바이너리 형식을 구분하는 방법을 배웠습니다. 이 직접적인 접근 방식은 Git 이 바이너리 파일을 처리하는 방식이 텍스트 파일과 크게 다르기 때문에 중요합니다.



