옵시디언 GIT - 충돌 방지 동기화용 배치파일 스크립트


여러 PC에서 옵시디언을 사용중인데, 동기화를 Git 플러그인을 이용하면 충돌이 나는 일이 종종 있습니다. (conflict-files-obsidian-git.md) 이는 Git 동기화가 옵시디언에 구동된 문서의 라이프사이클과 맞지 않을 때, 또는 여러 pc에서 각각 동일한 경로의 새 파일을 생성한 경우 주로 발생합니다.

이 스크립트는 Windows 환경에서 전자의 경우에 충돌 가능성을 줄여주는 방법입니다.

Git 설치

이 방법은 깃 명령어를 옵시디언 외부에서 사용하는 방법입니다. 따라서 Git을 Windows에 설치해야 합니다.

  1. Git 설치하기:

    • Git 공식 웹사이트에서 Windows용 Git 설치 프로그램을 다운로드합니다 https://git-scm.com/downloads/win
    • 다운로드한 설치 프로그램을 실행합니다
    • 설치 과정에서 대부분 기본 설정을 그대로 사용해도 됩니다
    • [!] “Adjusting your PATH environment” 단계에서는 “Git from the command line and also from 3rd-party software” 옵션 선택 합니다.
    • 설치가 완료되면 Windows 재시작 (권장)
  2. 설치 확인:

    • Windows 명령 프롬프트(cmd) 실행
      • 설치 후 재부팅 하지 않았다면, 프로그램 종료 후 다시 실행해주세요
    • 다음 명령어 입력:
git --version

동기화 방법 1. 시작 / 종료시 스크립트 실행하기

시작시 동기화 스크립트

@echo off
cd /d %~dp0
echo === Obsidian Git Sync Start ===
echo Pulling latest changes...

:: 현재 브랜치 확인
for /f "tokens=* USEBACKQ" %%F in (`git branch --show-current`) do set branch=%%F
echo Current branch: %branch%

:: 변경사항 임시 저장
git stash

:: 원격 저장소에서 변경사항 가져오기
git pull origin %branch%

:: 임시 저장한 변경사항 적용
git stash pop

:: 충돌이 있는지 확인
git diff --check
if %errorlevel% neq 0 (
    echo WARNING: Conflicts detected! Please resolve manually.
    pause
) else (
    echo Sync completed successfully!
)

echo === Sync Complete ===
timeout /t 3

종료시 동기화 스크립트

@echo off
cd /d %~dp0
echo === Obsidian Git Sync End ===

:: 현재 브랜치 확인
for /f "tokens=* USEBACKQ" %%F in (`git branch --show-current`) do set branch=%%F
echo Current branch: %branch%

:: 변경사항 확인
git status

:: 모든 변경사항 스테이징
git add .

:: 변경사항이 있다면 커밋
git diff --staged --quiet
if %errorlevel% neq 0 (
    echo Committing changes...
    git commit -m "Auto-sync: %date% %time%"
    
    :: 원격 저장소에 푸시
    git push origin %branch%
    echo Changes pushed successfully!
) else (
    echo No changes to commit.
)

echo === Sync Complete ===
timeout /t 3

동기화 방법 2. 시작 / 종료 통합 통기화 실행

@echo off
setlocal EnableDelayedExpansion

:: 옵시디언 설치 경로 (실제 경로로 수정 필요)
set OBSIDIAN_PATH="C:\Program Files\Obsidian\Obsidian.exe"
:: 옵시디언 볼트 경로 (스크립트 파일이 볼트 경로와 일치하지 않는 경우 수정 필요)
set VAULT_PATH="%~dp0"

echo === Obsidian Launcher with Git Sync ===
cd /d %VAULT_PATH%

:: Git 설치 확인
git --version > nul 2>&1
if %errorlevel% neq 0 (
    echo Git is not installed! Please install Git first.
    pause
    exit /b 1
)

echo Starting Git sync...
:: 현재 브랜치 확인
for /f "tokens=* USEBACKQ" %%F in (`git branch --show-current`) do set branch=%%F
echo Current branch: %branch%

:: Fetch 먼저 실행하여 변경사항 확인
echo Fetching changes...
git fetch origin %branch%

:: 변경사항 확인
git diff --name-only HEAD..origin/%branch% > changes.txt
set /p CHANGES=<changes.txt
del changes.txt

if not "!CHANGES!"=="" (
    echo Changes detected. Pulling changes...
    :: 현재 변경사항 저장
    git stash
    :: 원격 변경사항 가져오기
    git pull origin %branch%
    :: 저장했던 변경사항 적용
    git stash pop
    
    :: 충돌 확인
    git diff --check
    if !errorlevel! neq 0 (
        echo WARNING: Conflicts detected! Please resolve manually.
        pause
    )
) else (
    echo No changes to pull.
)

echo Starting Obsidian...
start "" %OBSIDIAN_PATH% %VAULT_PATH%

:: Obsidian이 종료될 때까지 대기
echo Waiting for Obsidian to close...
:WAIT_LOOP
tasklist /FI "IMAGENAME eq Obsidian.exe" 2>NUL | find /I /N "Obsidian.exe">NUL
if "%ERRORLEVEL%"=="0" (
	timeout /t 30 >nul
    goto WAIT_LOOP
)

echo Obsidian closed. Starting final sync...

:: 변경사항 확인
git status

:: 변경사항이 있다면 커밋 및 푸시
git diff --exit-code --quiet
if %errorlevel% neq 0 (
    :: 모든 변경사항 스테이징
    git add .
    
    :: 커밋
    git commit -m "Auto-sync: %date% %time%"
    
    :: 원격 저장소에 푸시
    git push origin %branch%
    echo Changes pushed successfully!
) else (
    echo No changes to commit.
)

echo === All operations completed ===
timeout /t 3
exit