Ubisam-MergeTool/doc/진행상황.md
ksj09406 4029336b88 밖에서 부르기: 명령줄 인자 수신 · 탐색기 보내기 등록
git config 에 mergetool/difftool 로 등록하는 쪽은 전부터 있었는데 정작 그 인자를
받는 쪽이 없어 다리가 반만 놓여 있었다. 나머지 반쪽을 놓고, 탐색기에서도 부를 수 있게 했다.

- Services/StartupArgs: 켤 때 넘어온 인자를 읽는다.
  이름표 붙은 것(--merge --base B --local L --remote R --merged M)과 그냥 넘어온 경로
  둘 다 받는다. 경로가 폴더면 폴더 비교로, 파일이면 파일 비교로 보낸다.
  difftool 의 LOCAL/REMOTE 와 셸이 주는 "먼저 고른 것/나중 것" 은 뜻이 달라 따로 담는다 -
  이 도구의 왼쪽은 늘 "기준"이라 difftool 에서는 REMOTE 가 왼쪽이 된다.

- Services/ShellIntegration: 탐색기 "보내기" 메뉴에 바로가기를 둔다.
  처음에는 우클릭 메뉴에 바로 넣으려고 레지스트리에 정적 verb 를 등록했다
  (HKCU\Software\Classes\AllFilesystemObjects\shell\...). 키는 제대로 들어갔고
  HKEY_CLASSES_ROOT 에도 병합돼 보였는데 탐색기 메뉴에는 뜨지 않았다.
  확인해 보니 이 PC 에서 우클릭 메뉴에 나오는 다른 프로그램(Notepad++ · Git Bash ·
  WinMerge)은 전부 HKLM 에 등록돼 있었고, HKCU 에 넣은 것은 - 우리 것이든 확인용으로
  넣어 본 메모장 항목이든 - 하나도 그려지지 않았다. HKLM 은 관리자 권한이 필요해 쓸 수 없다.

  그래서 보내기(SendTo)로 갔다. %APPDATA%\Microsoft\Windows\SendTo 에 바로가기 파일
  하나를 두는 것이 전부라 레지스트리도 권한도 필요 없고 윈도우 판을 타지 않는다.
  한 단계 더 들어가는 것이 유일한 단점인데, 대신 여러 개를 골라 한 번에 보낼 수 있어
  미뤄 두었던 "파일 두 개 골라 비교" 가 덤으로 따라왔다.
  등록/해제할 때 예전 판이 레지스트리에 남긴 흔적도 같이 지운다.

  셸 확장 DLL 은 쓰지 않았다 - DLL 은 탐색기 프로세스 안에서 돌아 잘못되면 탐색기가 죽는다.

- GitWorkspace.RouteStartupArgs 가 요청을 화면으로 보낸다. 창이 다 만들어진 뒤에 탭을
  옮겨야 해서 ApplicationIdle 로 미루고, 요청 자체는 남겨 두어 늦게 만들어진 화면이
  스스로 집어 가게 했다(폴더 비교 쪽도 파일 비교와 같은 방식으로 추가).

- 곁들여: 파일 비교가 "양쪽 경로가 모두 있을 때만" 열리고 있었다. 셸은 하나만 줄 수도
  있으므로 한쪽만 있어도 열도록 고쳤다 - 없는 쪽은 빈 내용이 되어 전부 추가로 보인다.

ArgsTest 26건 신설. 전체 356건 통과.
실행 확인: 폴더 경로로 켜면 폴더 비교 탭에 그 폴더가 왼쪽에, 파일 두 개로 켜면 파일 비교
탭에 나란히. 등록 버튼을 누르면 보내기 메뉴에 항목이 생기고 버튼 이름이 "탐색기 보내기
해제" 로 바뀐다(실제 탐색기 메뉴에서 확인).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 17:25:42 +09:00

9.2 KiB

MergeHub 진행 상황

작업 하나가 끝날 때마다 이 표를 고치고 로컬 커밋한다. 푸시는 하지 않는다 — 사내 Gitea 저장소가 만들어지면 그때 한 번에 올린다.

상태 표기: 대기 · 진행 · 완료


이번 주 목표 (2주차 · 폭 넓히기)

기획안(문서/사내_MergeTool_개발기획안) 기준으로 기능 덩어리를 100% 로 채우는 것이 목표다. 한 덩어리를 깊게 파는 것보다 여러 덩어리를 "있다"고 말할 수 있는 선까지 올린다.

④ Git 조작 — 완료 (2026-09-08)

서비스에는 이미 있는데 화면에 없던 것들이라, 다섯 가지가 하루가 아니라 반나절에 붙었다.

상태 항목 내용 확인
완료 커밋 이름 변경(amend) 커밋 수정 버튼. 고쳐 쓸 메시지를 다시 치지 않게 마지막 메시지 버튼도 함께 뒀다 확인: 6e6bb78 → 0d7401f 로 메시지가 바뀜
완료 stash 목록 콤보에서 골라 적용/삭제. 목록이 바뀌면 고른 항목을 다시 잡는다 - 하나 꺼내면 번호가 당겨지는데 옛 항목을 붙들고 있으면 다음 삭제가 엉뚱한 것을 지운다 확인: 저장 → 목록에 뜸 → 적용 → 워킹트리 복구
완료 두 커밋 사이 비교 이력에서 여기부터 로 시작점을 잡으면 그 뒤 고르는 커밋이 끝점이 된다. 안 잡으면 지금까지처럼 부모와 비교 확인: 헤더가 2766bc5 → 6e6bb78 (2개 파일)
완료 blame (줄별 작성자) Blame 탭 신설. 변경 목록에서 파일을 고르고 blame 을 누르면 경로가 넘어간다 확인: 31줄 전부 커밋·날짜·작성자 가 붙어 나옴
완료 변경분 파일 추출 GitService.ExportChangedFiles 신설. 저장소 안 경로 구조를 그대로 만들고, 바이트 그대로 옮긴다(텍스트로 다시 쓰면 줄바꿈·인코딩이 바뀐다). 지워진 파일은 뽑을 것이 없어 건너뛴다 확인: 2개 파일 → ...Temp (건너뜀 0개)

③ 3-Way 병합 — 완료 (2026-09-08)

"볼 수 있다"에서 "끝낼 수 있다"로.

상태 항목 내용 확인
완료 자동 병합 저쪽만 고친 줄(ThreeWayState.RemoteChanged)을 한 번에 가져온다. 충돌과 내가 고친 줄은 안 건드린다. git merge 가 자동으로 해 주는 일을 여기서도 해 주는 것 Theirs only 1 → 0, 자동 병합 버튼이 스스로 꺼짐
완료 충돌만 이동 이전 충돌 / 다음 충돌 (Alt+Shift+↑↓). 아직 안 정한 충돌만 딛는다 3개를 차례로 딛고 마지막에 버튼이 꺼짐
완료 병합 완료 판정 ACTIONS 위쪽에 남은 충돌 N개(빨강) → 충돌 정리 끝(초록) 3개 → 2 → 1 → 끝

여기서 판단이 하나 필요했다 — 충돌인지 아닌지는 BASE·MINE·REMOTE 를 견주면 저절로 나오지만, "내 것으로 간다"고 정한 줄은 내용이 그대로라 여전히 충돌로 보인다. 그래서 NeedsDecision (충돌이면서 아직 반영·수정 표시가 없는 줄)을 따로 두었다. 그 결정은 글을 바꾸지 않으므로 편집 뒤 다시 정렬하면 사라지는데, 얼어 있는 BASE 줄 번호(없으면 MINE 줄 번호)로 붙들어 되살린다.

곁들여 고친 것: Take Mine · Take Theirs 버튼이 줄을 옮겨도 켜짐/꺼짐이 그대로였다. CommunityToolkit 커맨드는 CommandManager 를 구독하지 않는데 이 둘만 갱신 목록에서 빠져 있었다. 키보드(Alt+←/→)로는 되고 버튼만 안 되던 이유가 이것이다.

① 폴더 비교 — 완료 (2026-09-08)

상태 항목 내용 확인
완료 폴더째 복사·삭제 파일 하나씩만 되던 것을 폴더에도 열었다. 확인 창에 안에 든 파일 수를 적는다 - "폴더 하나"라고만 물으면 몇 개가 덮이는지 모르는 채 확인을 누르게 된다 sub(파일 2개) 폴더째 복사 → bsubdeep wo.txt 까지 따라옴
완료 상태별 보기 필터 다른 것만 / 전체 / 왼쪽에만 / 오른쪽에만 / 같은 것만. 다시 비교하지 않고 목록만 다시 그린다 15개 → "왼쪽에만" 5개, 요약 줄은 그대로
완료 비교 취소 FolderComparer.Compare 에 CancellationToken. 항목 하나를 볼 때마다 확인하므로 누르는 즉시 멈춘다. 앞서 본 결과는 그대로 남는다 테스트 3건

설계 하나: 파일을 실제로 옮기고 지우는 부분을 Services/FileOps.cs 로 뺐다. 되돌릴 수 없는 일이라 화면 없이 검사할 수 있어야 하기 때문이다 - 겹치는 파일은 덮고, 대상에만 있던 파일은 남기고, 두 번 복사해도 같은지를 테스트로 못 박았다.

② 파일 비교 — 완료 (2026-09-08)

상태 항목 내용 확인
완료 바꾸기 (Ctrl+H) 찾기 칸 아래에 바꿀 말 줄이 붙는다(Ctrl+F 로 열면 안 뜬다 - 찾기만 할 때 자리를 뺏지 않는다). 바꾸기 는 고른 자리가 찾는 말일 때만 바꾸고 다음으로 넘어간다 - 엉뚱한 자리를 덮어쓰는 것보다 한 번 더 누르게 하는 편이 낫다 PulseUs → PulseMicros 2개 바꿈
완료 덩어리 단위 반영 이 덩어리 반영(Alt+Shift+→). 차이로 잡힌 줄이 이어지는 구간을 한 번에 마지막 차이에서 2줄 한 번에 반영
완료 인코딩·줄바꿈 변환 저장 ACTIONS 의 저장 형식 두 칸. 기본 "원본 유지"라 지금까지와 똑같이 나간다. UTF-8 / UTF-8(BOM) / CP949 · CRLF / LF 화면 확인
완료 바이너리·이미지 비교 "줄 단위로 비교할 수 없습니다" 한 줄로 끝나던 것을 답이 있는 화면으로. 크기·SHA-1·처음 갈리는 바이트 위치를 알려 주고, 그림이면 나란히 띄우고 아니면 앞 4KB 를 16진으로 늘어놓는다(다른 줄만 색) .bin 두 개: "왼쪽 17 B · 오른쪽 19 B · 처음 갈리는 곳 0x10" · .png 두 개 나란히

⑤ 밖에서 부르기 — 완료 (2026-09-08)

상태 항목 내용 확인
완료 명령줄 인자 수신 --merge/--diff --base/--local/--remote/--merged 와 그냥 넘어온 경로. 이것이 다리의 나머지 반쪽이다 - git config 에 등록하는 쪽은 전부터 있었는데 받는 쪽이 없었다 ArgsTest 26건 · 실제 실행 2건
완료 탐색기에서 부르기 우클릭 → 보내기 → MergeHub 로 비교. Git 탭 버튼 하나로 등록/해제하고 버튼 이름이 지금 상태를 말한다 실제 메뉴에서 확인

우클릭 메뉴에 바로 넣으려다 보내기로 돌아섰다. 처음에는 레지스트리에 정적 verb 를 넣었다 (HKCU\Software\Classes\AllFilesystemObjects\shell\...). 키는 제대로 들어갔고 HKEY_CLASSES_ROOT 에도 병합돼 보였는데 탐색기 메뉴에는 뜨지 않았다. 확인해 보니 이 PC 에서 우클릭 메뉴에 나오는 다른 프로그램(Notepad++ · Git Bash · WinMerge)은 전부 HKLM(전체 사용자)에 등록돼 있었고, HKCU 에 넣은 것은 - 우리 것이든 실험용으로 넣은 메모장 항목이든 - 하나도 그려지지 않았다. HKLM 은 관리자 권한이 필요해 쓸 수 없다.

그래서 보내기(SendTo) 로 갔다. %APPDATA%\Microsoft\Windows\SendTo 에 바로가기 파일 하나를 두는 것이 전부라 레지스트리도 권한도 필요 없고 윈도우 판을 타지 않는다. 한 단계 더 들어가는 것이 유일한 단점인데, 대신 여러 개를 골라 한 번에 보낼 수 있다 - 미뤄 두었던 "파일 두 개 골라 비교"가 덤으로 따라왔다.

셸 확장 DLL 은 쓰지 않았다 - DLL 은 탐색기 프로세스 안에서 돌아 잘못되면 탐색기가 통째로 죽는다.

고른 것이 하나뿐이면 왼쪽만 채우고 오른쪽은 비워 둔 채 화면을 연다 - 사용자가 그 자리에서 상대를 고르면 되고, 아무것도 안 열리는 것보다 낫다.


3~4주차로 미룬 것

디테일이라 지금 붙잡을 일이 아니다.

  • 파일·폴더 드래그&드롭, 최근 파일 목록
  • 로그인·권한
  • 비교 결과 보고서 내보내기
  • 대용량 파일 성능 (수만 줄) — 실제 소스 크기를 확인한 뒤 판단

완료 기록

날짜 항목 커밋
2026-09-08 저장소 개설 (MergeHub · UbisamPlatform 각각) 7719094 / 36ee902
2026-09-08 ④ Git 조작 5가지 — amend · stash 목록 · 커밋 간 비교 · blame · 변경분 추출 9956567
2026-09-08 ③ 3-Way — 자동 병합 · 충돌만 이동 · 병합 완료 판정 85c5e9e
2026-09-08 ① 폴더 비교 — 폴더째 복사·삭제 · 보기 필터 · 비교 취소 524a6a7
2026-09-08 ② 파일 비교 — 바꾸기 · 덩어리 반영 · 저장 형식 · 이진/그림 비교 de1a43c 55d9deb
2026-09-08 ⑤ 밖에서 부르기 — 명령줄 인자 · 탐색기 우클릭 아래