본문으로 건너뛰기

남은 것과 연동

「워크북 3-way 병합」으로 돌아가기


7. 하지 않는 것

명시하지 않으면 결손으로 오해되는 것들입니다.

무엇근거
서식·차트·도형·매크로·피벗·조건부 서식의 병합mine의 것이 그대로 남습니다. 값이 아닌 것을 병합하려면 워크북 전체의 모델이 필요하며, 이 저장소가 워크북에서 읽는 것은 값입니다
셀 주석의 병합mine의 것이 남습니다. WorkbookPackage가 읽고는 있으나 컬럼 설명으로만 사용하며, §4.5의 표 밖 판정에도 걸리지 않으므로 문서에 명시합니다
수식 자체의 3-way 병합수식 셀은 충돌로 보고합니다. 참조 범위의 이동을 함께 판정해야 하므로 별개의 크기입니다
구글 스프레드시트파일이 없으므로 병합할 대상이 없습니다

8. 미결

  • 행 시프트 — 실측하였고, 레이아웃에 따라 답이 분기합니다. §8.1.
  • .xlsb의 쓰기. 읽기는 됩니다.xlsx·.xlsm·.xlsb·.xls 전부이고, 게이트가 .xlsx.xlsb 픽스처를 각각 읽습니다(두 형식은 리더 안에서 다른 코드입니다). 그러므로 1·2단계는 .xlsb에 그대로 적용됩니다. 남은 것은 쓰기이고, 그쪽은 형식이 다릅니다 — zip 안의 XML이 아니라 바이너리 레코드 스트림이라 §4.6의 스트리밍 패치가 이전되지 않고, 쓰는 라이브러리도 없습니다. 3단계는 .xlsx로 시작하고 .xlsb는 충돌로 보고합니다 — 잘못 쓰는 것보다 못 쓴다고 보고하는 편이 낫습니다.
  • CI에서의 자동 병합 허용 여부. 사람이 확인하지 않은 병합 결과를 CI가 커밋하도록 할지는 운영 규약의 결정이며, 여러 사람이 함께 쓸 때의 「하나의 산출물 트리에 쓰는 주체는 하나」 원칙과 함께 판단합니다.
  • 로드맵상의 순서. 남은 항목은 깊은 스큐의 나머지 언어와 범용 압축 레이어입니다. 이 기능을 그 앞에 둘지 뒤에 둘지는 정해지지 않았습니다.

8.1 행 시프트 — 실측

--dump-schema가 진짜 사각형을 내주므로, 「표 아래·옆에 무엇이 있는가」를 셀 수 있게 되었습니다. 표마다 그 시트의 값 있는 셀을 전부 훑어 사각형 밖에 있는지 확인한 것입니다.

데이터셋아래에 내용옆에 내용둘 다 없음
마커·시트탭 레이아웃67개2개 (2%)18개 (26%)47개 (70%)
이름 기반 레이아웃7개3개 (42%)4개 (57%)3개 (42%)

두 레이아웃의 답이 다릅니다. 시트 하나가 표 하나에 가까운 쪽에서는 덧붙이기가 97%를 덮으므로 시프트가 필요하지 않습니다. 이름이 사각형을 시트 안쪽에 꼭 맞게 잡는 쪽에서는 절반 가까이가 막히고, 그 절반을 열려면 시프트가 필요합니다.

그래도 지금은 시프트를 만들지 않습니다. 막히는 경우의 동작이 「거부하고 그 셀 주소를 대는 것」이고, 그것은 오늘 상태(한쪽 작업이 소실되는 것)보다 낫습니다. 그리고 이름 기반 쪽 표본이 7개뿐이라, 시프트의 크기를 정하기 전에 더 큰 표본이 필요합니다.

표본이 작았던 이유는 없어졌습니다. 여기 「변환 산출물 폴더가 없어서」라고 적어 두었는데, .xlsb의 정의된 이름 이후로는 변환본이 필요하지 않습니다 — 원본 .xlsb 21개를 그대로 읽으므로 이름 기반 표본이 36개 워크북 · 544개 테이블입니다. 시프트를 판단할 때 그 표본으로 다시 측정하면 됩니다.

컬럼 추가도 같은 자리입니다. 옆에 내용이 있는 표가 26%·57%이므로, 컬럼을 오른쪽에 덧붙이는 것은 행보다 더 자주 막힙니다.


9. CLI와 SCM 연동

9.1 옵션

mabbit --diff --base <파일> --mine <파일> [--recipe <파일>] [--path <경로>]
mabbit --merge --base <파일> --mine <파일> --theirs <파일> --result <파일> \
[--recipe <파일>] [--path <경로>] [--key <시트>:<컬럼>]

--recipe가 없으면 §4.2의 HeuristicSchema로 동작합니다. --path는 어느 소스 항목이 그 파일을 덮는지 판정하는 데 사용하며, §8의 확장자 판정에도 함께 쓰입니다.

9.2 git 등록

*.xlsx merge=mabbit
*.xlsb merge=mabbit
[merge "mabbit"]
name = Mabbit workbook merge
driver = mabbit --merge --base %O --mine %A --theirs %B --result %A --path %P --recipe recipe.jsonc

git은 결과를 %A에 쓰고 종료 코드로 판정합니다 — 0이 성공, 그 밖이 충돌입니다.

9.3 그 밖의 SCM

Perforce·PlasticSCM·TortoiseGit은 인자 순서만 다르고 요구하는 것은 같습니다(base·mine·theirs·result 4개 경로와 종료 코드). 연동 문서는 doc/에 별도로 두고, 이 스펙은 git까지만 규정합니다.