본문으로 건너뛰기

mabbit — 워크북 3-way 의미 병합

문서 목록으로

mabbit


1. 요약

워크북을 파일이 아니라 표로 병합합니다. 두 사람이 같은 .xlsx를 수정하였을 때, 셀의 위치가 아니라 테이블·행 키·컬럼의 3단계로 정합하여 병합하고, 병합할 수 없는 자리만 충돌로 보고합니다.

이것이 성립하는 근거는 하나입니다 — 이 저장소는 그 워크북의 구조를 이미 읽을 수 있습니다. 어느 시트가 표인지, 어느 사각형이 테이블의 경계인지, 어느 컬럼이 기본 인덱스인지를 레이아웃 파서가 산출합니다. 범용 엑셀 병합 도구가 행을 위치로 정합할 수밖에 없는 자리에서, 이 도구는 키로 정합할 수 있습니다.

무엇현재이 스펙 이후
같은 워크북의 동시 수정한쪽의 작업이 소실됩니다. 여러 사람이 함께 쓸 때가 도구의 상한으로 기재해 둔 자리입니다겹치지 않는 수정은 병합되고, 겹치는 자리만 셀 단위로 보고됩니다
워크북 두 개의 차이 확인수단이 없습니다. 변환한 뒤 히스토리에서만 확인합니다--diff가 테이블·행·셀 단위로 산출합니다
병합 결과의 신뢰병합 결과에 검증 파이프라인을 그대로 적용합니다. 중복 id와 깨진 참조가 커밋 전에 검출됩니다

대상은 파일로 존재하는 워크북입니다. 구글 스프레드시트는 파일이 아니므로 대상이 아니고, 그쪽의 동시 편집은 id 대역 분할이 계속 담당합니다.


1.1 현재 상태 — 되는 것과 안 되는 것

이 문서의 나머지는 설계이고, 이 절만 현재 구현입니다. 6단계 전부 되어 있습니다 — git 병합 드라이버로 등록해서 쓸 수 있습니다.

되는 것

무엇비고
--diff로 워크북 2개 비교테이블·행 키·컬럼 3단계. 행은 위치가 아니라 키로 정합합니다
변경마다 셀 주소 보고Item!C2 형태. 텍스트와 JSON 두 형식(--format), 파일로도(--out)
.xlsx · .xlsm · .xlsb · .xls 읽기4종 전부. 게이트가 .xlsx.xlsb를 각각 읽습니다 — 리더 안에서 다른 코드입니다
확장자 없는 파일 읽기--path가 주는 저장소 경로에서 형식을 판정합니다. git이 넘기는 임시 파일이 이 형태입니다
키 컬럼 지정--key <시트>:<헤더> 또는 --key <시트>:<열 문자>. 없으면 첫 컬럼
따라갈 수 없는 행의 보고키가 빈 행과 중복 키를 차이와 분리해서 보고합니다. 자기 자신과 비교하면 「차이 없음」이고 주석만 남습니다
--merge로 워크북 3개 판정§4.3~§4.5의 규칙 전부. 충돌마다 base·mine·theirs 셋과 셀 주소를 함께 냅니다
표 밖 영역의 변경 검출표 사각형 밖을 시트마다 해시해 3개 파일을 대조합니다
--result로 병합 결과 쓰기mine의 사본에 셀 값만. 표 밖은 바이트가 동일하고 게이트가 그것을 대조합니다
행 추가·삭제추가는 표 아래에 덧붙이고, 자리가 없으면 거부합니다. 삭제는 표 안의 셀을 비웁니다
git 병합 드라이버--result %A로 제자리에 씁니다. 종료 코드 0 병합 · 1 충돌
충돌을 보는 페이지--format html. 자립한 파일 하나이고 값 3개를 나란히 놓습니다
진짜 표 사각형--schematabbit --dump-schema의 JSON을 읽습니다. 없으면 추정으로 동작합니다
게이트 67개.github/workflows/mabbit.yml이 리눅스와 윈도우 양쪽에서 돌립니다. 실제 git으로 실제 저장소를 병합하는 것 포함

안 되는 것

무엇어디서
컬럼·테이블이 오가는 병합. 컬럼이 오가거나 시트가 생기고 없어지는 것은 거부하고 이유를 댑니다미착수
.xlsb 쓰기. 읽기는 됩니다. 쓰기는 거부합니다§8

|서식·차트·수식·주석의 병합|§7 — 하지 않기로 한 것| |구글 스프레드시트|§7 — 하지 않기로 한 것|


이 문서의 나머지

무엇어디
배치와 설계왜 독립한 프로그램인지, 참고한 구현, 그리고 병합 알고리즘
단계와 충돌 표시구현 단계와, 충돌을 사람이 보는 화면
남은 것과 연동담지 않은 것, 미결, 그리고 SCM 에 붙이는 법