| 기능 | 설명 |
|---|---|
| 📝 파일 변경 감지 자동 커밋 | 파일 생성/수정/삭제/이름 변경 후 N초 debounce 대기 → 자동 커밋 & 동기화 |
| 🚪 종료 시 자동 저장 | X 버튼으로 닫을 때 변경사항을 commit & push 후 종료, Notice로 진행 상황 안내 |
| 🔄 자동 커밋 & 동기화 | 설정한 간격마다 자동으로 커밋 → Pull → Push 실행 |
| ⬇️ 자동 Pull | 설정한 간격마다 원격 저장소에서 변경사항 자동 수신 |
| 🚀 시작 시 Pull | Obsidian 시작 시 자동으로 최신 상태로 갱신 |
| ⚔️ 충돌 해결 뷰 | 병합 충돌 발생 시 3-way 뷰(좌:로컬 · 중:결과편집 · 우:원격)에서 직접 해결 |
| 📊 상태 표시바 | 현재 Git 상태 (Idle / Pulling / Pushing / Committing / Conflict) 및 변경 파일 수 표시 |
| ⚙️ Pull 방식 | Rebase 고정 — 로컬 커밋을 원격 위에 재배치 |
| 🌿 기본 브랜치 설정 | Push 및 동기화에 사용할 브랜치 지정, detached HEAD 시 폴백으로도 사용 |
업데이트가 자동으로 적용됩니다.
- Obsidian 커뮤니티 플러그인에서 BRAT 설치 및 활성화
- BRAT 설정 → Add Beta plugin from GitHub
Lemon-Obsidian/git-sync입력- Obsidian 재시작 후
@lemon/git-sync플러그인 활성화
- 최신 릴리즈에서
main.js,manifest.json,styles.css다운로드 - vault 내
.obsidian/plugins/lemon-git-sync/폴더에 복사 - Obsidian 재시작 후 설정 → 커뮤니티 플러그인에서 활성화
파일 변경 (생성 / 수정 / 삭제 / 이름 변경)
└─▶ debounce 타이머 리셋 (기본 30초)
└─▶ 타이머 만료 → commitAndSync()
├─▶ commit (변경사항 없으면 스킵)
├─▶ pull --rebase
└─▶ push origin <기본 브랜치>
N분 주기 타이머 (autoCommitInterval)
└─▶ commitAndSync() (위와 동일)
N분 주기 타이머 (autoPullInterval)
└─▶ pull --rebase
X 버튼 클릭
└─▶ beforeunload 감지 → 창 닫기 차단
└─▶ 변경사항 확인
├─▶ 없음 → 바로 종료
└─▶ 있음 → "⏳ 저장 중..." Notice 표시
├─▶ commit
├─▶ "✓ 커밋 완료, Push 중..." Notice 표시
├─▶ push
├─▶ "✓ Push 완료" Notice 표시
└─▶ 종료
강제 종료(작업 관리자 등)는 beforeunload가 호출되지 않아 동작하지 않습니다.
Pull 중 병합 충돌 감지
└─▶ 자동 루틴 즉시 정지
└─▶ 충돌 해결 뷰 자동 오픈
├─▶ 좌: 로컬(읽기 전용) / 중앙: 결과(편집 가능) / 우: 원격(읽기 전용)
├─▶ 중앙에서 직접 편집 또는 전체 적용 버튼으로 내용 선택
└─▶ "해결 완료 및 커밋" 클릭
├─▶ 머지 커밋
├─▶ push
├─▶ 충돌 해결 뷰 닫기
└─▶ 자동 루틴 재개
| 명령어 | 설명 |
|---|---|
pull (pull) |
원격 저장소에서 변경사항 수신 |
commit-push (commit -> push) |
변경사항 커밋 후 원격 저장소에 Push |
full-sync (전체 동기화, pull -> commit -> push) |
Pull → 커밋 → Push 순서로 전체 동기화 |
push (push) |
커밋 없이 현재 로컬 커밋을 Push만 실행 |
연결 진단 (connection diagnostic) |
Git 실행파일·저장소·Remote·브랜치·인증 상태 점검 |
자동 루틴 일시정지 / 재개 |
자동 커밋 · Pull 타이머 토글 |
하단 상태 표시바에 현재 Git 상태가 실시간으로 표시됩니다.
| 상태 | 아이콘 | 설명 |
|---|---|---|
| Idle | ✓ | 대기 중. 변경 파일 수 및 마지막 커밋 시각 표시 |
| Pulling | ↓ | 원격에서 변경사항 수신 중 |
| Pushing | ↑ | 원격으로 변경사항 업로드 중 |
| Committing | ● | 로컬 커밋 중 |
| Conflict | 병합 충돌 발생 — 클릭하면 충돌 해결 뷰 열기 | |
| 일시정지 | ⏸ | 자동 루틴 일시정지 상태 |
Pull 중 병합 충돌이 감지되면 자동으로 열립니다.
- 좌(로컬): 내 변경사항 — 읽기 전용 참조
- 중앙(결과): 최종 내용 직접 편집
- 우(원격): 받아온 변경사항 — 읽기 전용 참조
- ← 로컬 전체 적용 / 원격 전체 적용 → 버튼으로 한쪽 내용을 중앙에 일괄 적용
- 여러 파일이 충돌한 경우 이전 / 다음 버튼으로 순서대로 해결
- 모든 충돌 마커 제거 후 해결 완료 및 커밋 버튼 활성화
설정 → 플러그인 옵션 → @lemon/git-sync
| 항목 | 설명 | 기본값 |
|---|---|---|
| 시작 시 자동 Pull | Obsidian 시작 시 자동 Pull | ON |
| 자동 커밋 간격 (분) | N분마다 커밋 & 동기화. 0이면 비활성화 | 5 |
| 자동 Pull 간격 (분) | N분마다 Pull. 0이면 비활성화 | 10 |
| 커밋 메시지 | 커밋 메시지 템플릿. {{date}}는 현재 날짜/시간으로 대체. 본문에 수정/추가/삭제/이름변경 파일 목록 자동 추가 |
vault 백업: {{date}} |
| 파일 변경 시 자동 커밋 지연 (초) | 파일 변경 후 N초 debounce 대기 → 자동 커밋 & 동기화. 0이면 비활성화 | 30 |
Pull 방식은 Rebase로 고정되어 있습니다. 로컬 커밋을 원격 위에 재배치하여 깔끔한 히스토리를 유지합니다.
| 항목 | 설명 | 기본값 |
|---|---|---|
| 상태 표시바 표시 | 하단 상태 표시바 활성화 | ON |
| 변경 파일 수 표시 | 상태 표시바에 변경된 파일 수 함께 표시 | ON |
| 항목 | 설명 | 기본값 |
|---|---|---|
| 기본 브랜치 | Push 및 동기화에 사용할 브랜치. detached HEAD / rebase 중단 시 폴백으로도 사용 | main |
| Git 저장소 경로 | Vault 내 Git 저장소의 상대 경로. 비어있으면 Vault 루트 사용 | (비어있음) |
| Git 실행 파일 경로 | Git 바이너리 절대 경로. 비어있으면 시스템 기본값(git) 사용 |
(비어있음) |
pnpm install
pnpm dev # 개발 모드 (파일 변경 감지 + 자동 빌드)
pnpm build # 프로덕션 빌드빌드 후 main.js, manifest.json, styles.css를 vault의 .obsidian/plugins/lemon-git-sync/에 복사하면 즉시 반영됩니다.
src/
├── main.ts # 플러그인 진입점 · Git 핵심 동작 · 충돌 처리
├── types.ts # PluginSettings · GitState · ConflictFile 타입
├── constants.ts # 기본 설정값 · 뷰 타입 상수
├── gitManager.ts # simple-git 래퍼 (pull · push · commit · conflict 감지)
├── automaticsManager.ts # 자동 커밋 / Pull 타이머 · 파일 변경 훅 · 종료 시 저장
├── statusBar.ts # 하단 상태 표시바
├── mergeView.ts # 병합 충돌 해결 뷰 (좌우 분할)
├── promiseQueue.ts # Git 작업 직렬 실행 큐
├── commands.ts # 커맨드 팔레트 명령어 등록
└── setting/
└── settings.ts # 설정 탭 UI
styles.css # 플러그인 스타일
manifest.json # 플러그인 메타 (id: lemon-git-sync)
| 버전 | 주요 변경 |
|---|---|
| 1.16.3 | commit-push · full-sync 커맨드에서 변경사항이 없어도 push 진행하도록 수정 |
| 1.16.2 | 대용량 변경사항 대응 — git 작업 타임아웃 60초 설정 · 커밋 메시지 파일 목록 최대 20개 제한 (초과 시 "외 N개" 요약) |
| 1.16.1 | 종료 시 실행 중인 git 작업 완료 대기 → Pull 실패 Notice 방지 (promiseQueue.clear() + waitForIdle() 추가) |
| 1.16.0 | push 전용 커맨드 추가 · 연결 진단 모달 추가 (Git·저장소·Remote·브랜치·인증 점검) · 설정 탭에 진단 버튼 추가 |
| 1.15.0 | 커밋 메시지에 변경 파일 목록 추가 — 수정 / 추가 / 삭제 / 이름변경 파일을 한글 레이블로 표시 |
| 1.14.2 | 종료 시 자동 저장 push — gitManager.push() 직접 호출 대신 plugin.push() 사용으로 non-fast-forward 재시도 로직 적용 |
| 1.14.1 | 종료 시 자동 저장 — e.preventDefault() 비동기 호출 버그 수정 (Electron에서 창 닫기 차단이 작동하지 않던 문제) |
| 1.14.0 | 충돌 해결 후 rebase 상태이면 git commit 대신 git rebase --continue 사용 — non-fast-forward push 반복 오류 근본 원인 수정 |
| 1.13.3 | pull detached HEAD 감지에 "HEAD" 문자열 케이스 추가 — main ref 미갱신으로 인한 non-fast-forward 근본 원인 수정 |
| 1.13.2 | pull을 fetch origin + rebase origin/main 2단계로 분리 — fetch 누락에 의한 non-fast-forward 반복 수정 |
| 1.13.1 | pull 시 origin <branch> 명시적 지정 — 추적 브랜치 미설정 시 fetch 누락으로 인한 non-fast-forward 반복 수정 |
| 1.13.0 | 충돌 해결 뷰 3-way 레이아웃으로 재설계 — 좌(로컬) · 중(결과편집) · 우(원격) |
| 1.12.3 | push non-fast-forward 실패 시 pull 후 자동 재시도 |
| 1.12.2 | pull 실패/충돌 시 push 자동 스킵 — non-fast-forward 후 push 시도하던 문제 수정 |
| 1.12.1 | push 시 브랜치명이 HEAD인 경우 defaultBranch로 폴백하여 push 실패 수정 |
| 1.12.0 | 에러 발생 시 복사 가능한 에러 모달 추가 — 에러 메시지 전체 표시 + 클립보드 복사 버튼 |
| 1.11.1 | 충돌 해결 뷰 좌우 패널 정확히 50:50 분할 수정 |
| 1.11.0 | 충돌 해결 뷰 레이블 정렬 수정 (showPanel 적용) 및 UI 개선 — CONFLICT 배지, 로컬/원격 색상 구분 |
| 1.10.0 | Pull 방식 Rebase 단일 고정 — syncMethod 옵션 제거, 설정 UI 드롭다운 → 안내 텍스트로 교체 |
| 1.9.0 | pull 시 rebase 진행 중(REBASE 1/1) 상태 자동 감지 → rebase abort 후 defaultBranch로 복귀 |
| 1.8.0 | pull 시 detached HEAD 자동 감지 → defaultBranch로 checkout 후 진행 |
| 1.7.0 | 커맨드 팔레트 표시 이름 재수정 (full-sync / commit-push / pull) |
| 1.6.0 | 커맨드 팔레트 표시 이름 변경 (pull / commit-push / full-sync) |
| 1.5.0 | pull 실패 시 충돌 해결 뷰 미표시 버그 수정 · getConflicts() 파일 읽기 폴백 추가 |
| 1.4.0 | 기본 브랜치 설정 추가 (기본값: main) · detached HEAD 시 설정 브랜치로 폴백 |
| 1.3.0 | detached HEAD 에러 처리 · reset 방식 pull 수정 · 기본 병합 방식 rebase로 변경 |
| 1.2.0 | 충돌 해결 뷰 좌우 분할 패널로 변경 (unifiedMergeView → MergeView) |
| 1.1.0 | 파일 변경 debounce 커밋 · 종료 시 자동 저장 · 커맨드 재편 (commit & push / full-sync) |
| 1.0.0 | 초기 릴리즈 — 자동 커밋 타이머 · 자동 Pull · 충돌 해결 뷰 · 상태 표시바 |
Made with ☕ for Obsidian