문법을 아는 Git 병합 드라이버 mergiraf, MATLAB 지원 추가하며 영역 확장

Lobsters26일 전조회 2

mergiraf는 Git의 기본 병합 방식을 텍스트 줄 단위에서 문법 구조 단위로 끌어올리려는 오픈소스 merge driver다. 두 브랜치가 같은 파일을 건드렸을 때 줄이 겹친다는 이유만으로 충돌을 띄우는 대신, 각 언어의 구문 트리를 비교해 실제로 의미가 충돌하는지 판단하고 자동으로 합쳐준다. Codeberg의 mergiraf/mergiraf 저장소에서 개발되며, 지원하는 프로그래밍 언어와 파일 형식 목록이 꾸준히 늘고 있다.

가장 눈에 띄는 변화는 MATLAB 지원 추가다(#735). 여기에 더해 구조적 병합이 제한 시간을 넘겨 실패할 때 출력되는 경고에 문제가 된 파일의 경로가 함께 표시되도록 바뀌었다(#828). 예를 들어 `src/app/models.py`의 구조적 병합이 너무 오래 걸려 Git 기본 방식으로 되돌아가는 경우, 어떤 파일 때문인지 로그에서 바로 확인할 수 있다. 이 경고는 이슈 #466에서 논의된 최소한의 형태로, 원래 요청에 있던 타임아웃 직전 진행 표시줄은 당분간 제외됐다.

내부 구조를 다듬는 작업도 이어졌다. 구문 트리를 다루던 tree.rs가 ast.rs로 이름을 바꿔 역할을 분명히 했고(#324), 통합 테스트 케이스는 tests/data 디렉터리로 옮겨 관리하기 쉽게 정리했다(#808). 테스트 케이스를 최소 형태로 줄여주는 유틸리티 작업도 계속되고 있으며(#527), 테스트 데이터가 바뀌면 테스트 바이너리를 다시 빌드하도록 build.rs를 복원했다(#822).

저장소 운영과 기여 환경 쪽 변경도 여러 건 있다. 커밋해 두었던 .envrc는 예제 파일로 바꾸고 기여 방법 안내를 덧붙였으며(#711), .gitattributes를 통해 모든 파일의 충돌 마커 크기를 지정했다(#202). 체인지로그에는 이름 없는 항목에 커밋 id를 붙였고(#547), rustfmt 설정 파일은 빈 상태로 새로 만들었다(#710). nixpkgs를 고정하고 cargo audit 입력을 갱신했으며(#779), 오래된 의존성을 확인하는 CI 작업은 더 낮은 주기로 돌도록 조정했다(#794). .mailmap으로 작성자 이름을 정리한 작업(#253)도 포함된다.

커뮤니티 운영 측면에서는 ipsavitsky가 Developers 팀에 합류했고(#778), README에는 Zulip이 공개 Zulip 인스턴스 호스팅을 후원한다는 사실이 명시됐다(#783). 프로젝트는 CONTRIBUTING.md를 통해 기여자와 새 팀원을 받고 있고, Liberapay를 통한 후원도 안내하고 있다.

배경을 짚어보면, Git의 3-way 병합은 기본적으로 줄 기반이다. 같은 파일이라도 서로 멀리 떨어진 함수를 각자 고쳤다면 대개 문제없이 합쳐지지만, 줄이 인접해 있으면 의미상 충돌이 없어도 충돌로 표시된다. 언어별 파서를 붙여 구조를 인식하게 만드는 접근은 이런 불필요한 충돌을 줄이려는 시도이며, mergiraf는 이를 Rust로 구현해 Git의 merge driver로 끼워 넣는 방식이다.

실무에서는 리베이스나 장기 브랜치 병합에서 사람이 손으로 풀어야 하는 충돌 건수가 줄어드는 효과를 기대할 수 있다. 다만 도입 전에 팀이 쓰는 언어가 지원 목록에 있는지 확인해야 하고, 대형 파일에서 구조적 병합이 타임아웃되면 결국 Git 기본 병합으로 되돌아간다는 점도 알아두는 게 좋다. CI 로그에 남는 폴백 경고를 보면 어떤 파일이 병목인지 파악할 수 있다.

한계도 분명하다. 지원 언어와 파일 형식은 계속 추가되는 중이라 모든 언어를 커버하지는 못하며, 타임아웃 폴백이 걸리는 상황에서는 구조 인식의 이점을 받지 못한다. 한편 이 프로젝트가 자리한 Codeberg는 이용약관을 개정해 LLM 생성 콘텐츠를 제한하고 암호화폐 관련 프로젝트를 더 이상 허용하지 않기로 했다. 저장소 자체의 변경은 아니지만, 호스팅 플랫폼 정책 변화이므로 함께 살펴볼 필요가 있다.