loose-diff는 두 텍스트 파일을 비교하되, 파일 맨 끝에 있는 중요하지 않은 공백과 줄바꿈을 모두 무시하는 간단한 커맨드라인 유틸리티입니다. 코드의 기능에 영향을 주지 않는 사소한 포맷팅 차이로 인해 표준 diff 도구가 두 파일을 다르다고 판단하는 문제를 해결하기 위해 만들어졌습니다.
버전 관리 시스템(VCS)에서 특정 시점의 파일을 복원할 때, 복원 방식에 따라 원본과 미세한 차이가 발생할 수 있습니다. 이 유틸리티는 특히 diff/patch 이력을 기반으로 파일을 복원하는 과정에서 발생하는 "실질적 동일성" 문제를 해결하기 위해 설계되었습니다.
Git과 같은 버전 관리 시스템에서, diff 이력을 순차적으로 적용(patch)하여 파일의 최종 버전을 복원할 경우, 그 결과물이 원본 스냅샷과 완전히 동일한지 여부를 확인합니다.
-
Git 내부 객체(blob)를 통한 복원
git show <commit_hash>:<file_path>와 같이 저장소에 기록된 blob 데이터를 직접 이용하면, 바이트 단위로 100% 동일한 파일이 복원됩니다. 이는 가장 안전하고 정확한 방법입니다.- 차이 없음.
-
diff/patch이력을 통한 수동 복원- 로그에 기록된
diff정보를patch와 유사한 방식으로 순차 적용하여 복원할 경우, 일부 환경이나 도구의 구현 방식에 따라 원본과 미세한 차이가 발생할 수 있습니다.- 파일 끝 개행(Newline) 처리 차이:
diff로그의\ No newline at end of file구문이 무시되거나 반영 방식이 달라져, 복원된 파일의 마지막에 빈 줄이 추가되거나 삭제될 수 있습니다.
- 운영체제 개행(CRLF/LF) 차이:
- Windows(
CRLF)와 Unix 계열(LF) 환경을 오가며 작업할 때, Git의core.autocrlf설정이나 텍스트 편집기의 자동 변환으로 인해diff내용과 실제 파일 간의 개행 문자가 달라질 수 있습니다.
- Windows(
- 공백(Whitespace) 처리 차이:
- 일부
patch유틸리티나 서드파티 복원 도구가 줄 끝의 공백(trailing whitespace)을 다르게 적용하거나 제거할 수 있습니다.
- 일부
- 파일 끝 개행(Newline) 처리 차이:
- 로그에 기록된
- 정확히 동일한 파일을 복원하는 것이 목표라면,
diff/patch방식 대신 Git의 blob 스냅샷을 직접 사용하는 것이 가장 안전합니다. diff기반 복원 시, 위와 같은 요인들로 인해 최종 결과물에서 "기능적으로는 동일하지만, 문자열로는 다른" 파일이 생성될 수 있습니다.
loose-diff는 바로 이 지점에서 중요한 역할을 합니다. diff/patch 기반으로 복원된 파일이 원본과 실질적으로 동일한지를 검증할 필요가 있을 때, 파일 끝 개행이나 공백 같은 무의미한 차이를 무시하고 코드의 본질적인 내용이 같은지를 빠르고 정확하게 판단해줍니다.
- 끝 공백 무시: 파일의 맨 끝에 있는 모든 종류의 공백 문자(스페이스, 탭, 줄바꿈)를 제거한 후 비교합니다.
- 명확한 결과: 파일이 실질적으로 동일한 경우 성공 메시지를, 차이가 있는 경우 실패 메시지와 함께 상세
unified diff를 출력합니다. - 간단한 사용법: 복잡한 옵션 없이 두 개의 파일 경로만 인자로 받습니다.
- 순수 파이썬: 추가 라이브러리 설치 없이 파이썬 표준 라이브러리만으로 동작합니다.
- Python 3.x
터미널에서 다음과 같이 스크립트를 실행합니다.
python loose_diff.py <비교할_파일_1> <비교할_파일_2>$ python loose_diff.py original_file.py restored_file.py출력 결과:
--- Loose Diff ---------------------------------
a: original_file.py
b: restored_file.py
----------------------------------------------
✅ 파일이 실질적으로 동일합니다 (끝 공백/줄바꿈 무시).
$ python loose_diff.py file_with_changes.py original_file.py출력 결과:
--- Loose Diff ---------------------------------
a: file_with_changes.py
b: original_file.py
----------------------------------------------
⚠️ 파일 내용에 차이가 있습니다:
--- a/file_with_changes.py
+++ b/original_file.py
@@ -3,5 +3,5 @@
a
b
-Hello World
+Hello Python
c
d
이 프로젝트는 MIT 라이선스를 따릅니다. 자세한 내용은 LICENSE 파일을 참고하십시오.