Rust로 만든 콘텐츠 인식 Git difftool OmniDiff, AGPL로 공개
- Rust로 만든 콘텐츠 인식 Git difftool OmniDiff가 Show HN에 올라왔고, 트리 diff 알고리즘 APTED를 효율적으로 구현해 함수를 같은 클래스 안에서 위아래로 옮긴 변경을 삭제+삽입이 아니라 이동으로 잡아냄.
- 같은 저장소 기준으로 Difftastic은 완벽 diff 64%, 준완벽 17%인데 OmniDiff는 완벽 90%, 준완벽 5%이고, 속도는 p50 4ms 대 35ms, p99 420ms 대 637ms로 OmniDiff가 앞섬. 다만 Difftastic은 코드만 다루는데 전체 diff의 2/3가 코드임.
- delta는 표준 git diff 알고리즘에 색만 입히는 반면 OmniDiff는 알고리즘 자체가 다르고, 전체 diff의 약 3분의 1이 눈에 띄게 나아짐. 기본이 문자 기반이라 바뀐 문자만 강조하고 줄 전체 색칠은 옵션으로 추가할 수 있음.
- 라이선스는 3주 전에 AGPL-3.0-only로 재라이선스했고, 작성자는 빅테크가 AGPL을 꺼리는 걸 직접 겪어봐서 고른 정치적 선택이라며 상업 라이선스는 재미용 실험이라고 밝힘.
- git difftool을 만든 사람이 mergetools에 upstream으로 올려 git config 한 줄로 쓰게 하자고 제안했고, 3-way merge 지원은 APTED가 3방향 diff에 쓸 만한 결과를 만들지 못해 장기 과제로 남음.
Hacker News 의견들
delta랑 비교하면 뭐가 더 나음?
이동된 코드에서 훨씬 낫더라. delta는 표준 git diff 알고리즘에 색만 입히는데 OmniDiff는 알고리즘 자체가 다름. diff 3분의 1 정도가 확실히 좋아짐.
좋은 아이디어인데 AGPL+기부 라이선스로 프로젝트를 초기에 죽이는 셈임. 다른 팀이 언어 인식 differ 핵심을 BSD로 내면 그쪽이 이기고 git에 들어갈 수도 있음. 그쪽을 표준으로 밀고 상업적인 건 다른 데서 벌어야 함.
copyleft 진짜 신경 씀. 정치적 선택임. 빅테크가 AGPL 싫어하는 걸 직접 겪어봐서 골랐음. 상업 라이선스는 재미용 실험이고, 누가 더 나은 differ를 만들어도 괜찮음. 오픈소스 커뮤니티에 더 나은 differ만 있으면 됨.
diffsitter랑 difftastic이 MIT로 오래 있었으니 그 걱정은 별로임.
difftastic이랑 비교하면 좀 복잡한데 대략 이럼. difftastic은 코드만 다루는데 전체 diff의 2/3가 코드임. difftastic 지원 범위만 보면 difftastic은 64% 완벽, 17% 준완벽이고 OmniDiff는 90% 완벽, 5% 준완벽임. 속도는 p50 4ms 대 35ms, p99 420ms 대 637ms로 앞섬. 라이선스는 MIT 대 AGPL로 difftastic이 이김.
정말 잘 만들었음. 다른 툴보다 훨씬 minimal한 diff가 나옴. difftastic의 wide 터미널 side-by-side, 좁으면 unified로 바뀌는 기능이 아쉬움.
저자임. wide를 200컬럼 이상으로 보고 v로 강제할 수 있음. 기본값은 커뮤니티 의견에 따라 바꿀 수 있음.
delta의 diff-so-fancy 모드처럼 줄 색칠에 더해 바뀐 문자를 다른 색조로 강조하는 걸 OmniDiff 예시에서 못 봤음. 그것보다 나은 diff 예시를 좀 보여줄 수 있나? 그리고 delta는 Arch 공식 repo에 패키지가 있고 Debian, Arch, macOS에서 같은 방식으로 설치되는데 OmniDiff는 설치법이 3가지로 제각각이라 나는 이것만으로 건너뛸 듯.
저자임. OmniDiff는 기본이 문자 기반이라 바뀐 문자만 강조함. 줄까지 같이 칠하는 옵션은 추가할 수 있음. AUR은 스팸 때문에 닫혀 있고, brew로 리눅스 설치도 넣을 수 있음. delta보다 낫다는 건 함수를 같은 클래스 안에서 위아래로 옮긴 걸 텍스트 diff는 삭제+삽입으로 칠하는데 이건 이동으로 잡는다는 뜻임.
3-way diff도 되나? 안내에는 2-way git difftool 설정만 있던데, 앞으로 넣을 계획인가? 그리고 mergetools에 upstream으로 올려서 git config --global diff.tool omnidiff 한 줄로 쓰게 하는 데 관심 있나? 내가 오래전에 git difftool을 만들었는데 이런 툴이 내장 지원되면 좋음. 도와줄 수 있음.
저자임. 코드 diff 알고리즘은 APTED를 효율적으로 구현한 건데 이게 3방향 diff에 쓸 만한 결과를 만들지 못함. 좋은 3-way merge 알고리즘을 만들려고 실패한 시도가 노트북에 가득하고, 장기 목표 중 가장 어려운 것임. upstream 제안은 꼭 연락드리겠음.
예시를 봤는데 나는 OmniDiff 출력이 더 낫다고 못 느끼겠음. 다들 열광하는 걸 보면 내가 엄청 멍청한가 싶음.
따로 보면 되게 좋아 보이고 공들인 게 느껴져서 써볼 생각임. moved code 사례를 twain에 넣으면 잘 어울릴 것 같음. 근데 git difftool로 설정해서 써보니 데모 같은 게 안 나오고 변경된 새 쪽만 보이는 이상한 단일 컬럼 출력이 나왔음.
AGPL 붙은 새 Rust 소프트웨어라니 반가움. 사용자 입장에서 자유가 보장돼서 안심됨.
전역 git config를 안 바꾸고 git diff | omnidiff 같은 식으로 쓸 수 있나? delta는 git diff | delta --side-by-side로 됨.