Apache Subversion ์ค์ ์ง์ค์ ๋ฒ์ ๊ด๋ฆฌ ์๋ฒฝ ๊ฐ์ด๋: ์ ์ฅ์ ์ฒดํฌ์์(checkout), ์ปค๋ฐ(commit), ์
๋ฐ์ดํธ(update), ๋ธ๋์น & ํ๊ทธ(copy/switch/merge), ์ถฉ๋ ํด๊ฒฐ(resolve), ๋ฐ์ด๋๋ฆฌ ํ์ผ ์ ๊ธ(lock/unlock), svn:ignore ์์ฑ ๋ฐ Git vs SVN ๋ฉํ ๋ชจ๋ธ ๋น๊ต
## 1. ์ฌ์ ์๊ฑด & ํ๊ฒฝ ๊ตฌ์ฑ ๊ฐ์ด๋ (Prerequisites & Installation)
### ๐ป ์์คํ
์ค์น ๋ฐ ์คํ ์๊ตฌ์ฌ์ (System Requirements)
| ํญ๋ชฉ | ์ต์ ์ฌ์ (Minimum) | ๊ถ์ฅ ์ฌ์ (Recommended) | ์ฐธ๊ณ ๋ฐ ๋น๊ณ |
| :--- | :--- | :--- | :--- |
| **์ด์์ฒด์ (OS)** | Windows, macOS, Linux (๋ชจ๋ OS ์ง์) | Ubuntu 22.04 LTS, Windows 11, macOS Sonoma | POSIX ๋ฐ Windows ํ๊ฒฝ ์์ ์ง์ |
| **CPU** | 1 ์ฝ์ด ์ด์ | 2 ์ฝ์ด ~ 4 ์ฝ์ด ์ด์ | ์ ์ฅ์ diff ์ฐ์ฐ ๋ฐ ๋คํธ์ํฌ ์ง๋ ฌํ ์ฒ๋ฆฌ |
| **๋ฉ๋ชจ๋ฆฌ (RAM)** | 512 MB ์ด์ | 2 GB ~ 4 GB ์ด์ | ๋๊ท๋ชจ ์์
์ฌ๋ณธ(Working Copy) ํธ๋ฆฌ ์บ์ฑ |
| **๋์คํฌ (Storage)** | 100 MB ์ด์์ ์ฌ์ ๊ณต๊ฐ | 10 GB ~ 50 GB ์ด์์ SSD | ์์
์ฌ๋ณธ ๋ฐ `.svn` ๋ด๋ถ ํ๋ฆฌ์คํด(Pristine) ์ฌ๋ณธ ๋ณด๊ด |
| **๋คํธ์ํฌ / ํ๋กํ ์ฝ** | svn CLI 1.14 LTS (์ต์ ์์ ๋ฒ์ ) | `http://`, `https://`, `svn://`, `svn+ssh://` | ์ฌ๋ด ์ธํธ๋ผ๋ท ๋๋ VPN ํฌํธ(3690 / 443) ํ์ฉ |
---
### ๐ ์ด์์ฒด์ ๋ณ ์ค์น ๋ช
๋ น์ด
```bash
# ๐ง [1] Ubuntu / Debian ์ค์น
sudo apt update
sudo apt install -y subversion
# ๐ง [2] RHEL / Rocky Linux / CentOS
sudo dnf install -y subversion
# ๐ [3] macOS (Homebrew)
brew install subversion
# ๐ช [4] Windows
# Chocolatey ๋๋ Winget์ผ๋ก ์ค์น (TortoiseSVN ์ถ์ฒ)
winget install TortoiseSVN.TortoiseSVN
# ๋๋ ์์ CLI
choco install svn
# ์ค์น ๋ฐ ๋ฒ์ ํ์ธ
svn --version
# ์ถ๋ ฅ ์์: svn, version 1.14.3 (r1914484)
```
---
## 2. SVN ํต์ฌ ๋ฉํ ๋ชจ๋ธ: ์ค์ ์ง์ค์ VCS ์ํคํ
์ฒ (Mental Model)
SVN(Apache Subversion)์ Git๊ณผ ๊ฐ์ ๋ถ์ฐ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
(DVCS)๊ณผ ๋ฌ๋ฆฌ, ๋จ ํ๋์ **์ค์ ์๋ฒ(Central Repository)**๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ๊ณผ **๋จ์ผ ์ ์ญ ๋ฆฌ๋น์ ๋ฒํธ(Global Revision: r1, r2, r3...)**๋ฅผ ์๊ฒฉํ๊ฒ ๊ด๋ฆฌํ๋ ์ค์ ์ง์ค์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
(CVCS)์
๋๋ค.
### ๐ Git vs SVN ๋ฉํ ๋ชจ๋ธ & ํ์ค ๋ ์ด์์ (ASCII Diagram)
```text
[ SVN ์ค์ ์ง์ค์ ์ํคํ
์ฒ ]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Central SVN Repository Server โ
โ โ
โ โโโ /trunk : ์ฃผ ๊ฐ๋ฐ ๋ฉ์ธ ์คํธ๋ฆผ (Git์ main/master) โ
โ โโโ /branches : ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ฐ ๋ฆด๋ฆฌ์ฆ์ฉ ๊ฒฉ๋ฆฌ ๋ธ๋์น โ
โ โ โโโ /feature-login (r12 โ r15) โ
โ โโโ /tags : ํน์ ์์ ์ฝ๊ธฐ ์ ์ฉ ๋ฆด๋ฆฌ์ฆ ์ค๋
์ท (v1.0.0)โ
โ โ
โ * ์ ์ฒด ์ ์ฅ์๊ฐ ๊ณต์ ํ๋ ๋จ์ผ ์ ์ ๋ฆฌ๋น์ : r1 โ r2 โ r3... โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
์ฒดํฌ์์ / ์ปค๋ฐ โ (checkout / commit)
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Local Working Copy (๋ก์ปฌ ์์
์ฌ๋ณธ) โ
โ โ
โ - ๋ก์ปฌ์๋ ์ ์ฅ์ ์ ์ฒด ์ด๋ ฅ์ด ์์ (ํ์ํ ํ์ผ๋ง ๋ด๋ ค๋ฐ์)โ
โ - ์จ๊น ํด๋ `.svn` ์์ ๊ธฐ์ค ์๋ณธ(Pristine Base)๋ง ๋ณด๊ด โ
โ - ์คํ๋ผ์ธ ์ปค๋ฐ ๋ถ๊ฐ (๋ฐ๋์ ์ค์ ์๋ฒ์ ํต์ ํด์ผ ์ปค๋ฐ ์๋ฃ)โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### ๐งฉ Git vs SVN ํต์ฌ ์ฐจ์ด์ ํ๋์ ๋น๊ต
| ๋น๊ต ํญ๋ชฉ | Git (๋ถ์ฐ VCS) | SVN (์ค์ ์ง์ค VCS) |
| :--- | :--- | :--- |
| **์ ์ฅ์ ์์น** | ๋ชจ๋ ๊ฐ๋ฐ์ PC๊ฐ ์์ ํ ๋ก์ปฌ ์ ์ฅ์๋ฅผ ๋ณต์ | **์ค์ง ์๊ฒฉ ์๋ฒ 1๊ณณ์๋ง ์ ์ฅ์ ์กด์ฌ** |
| **๋ฆฌ๋น์ ์๋ณ์** | 40์๋ฆฌ SHA-1 ํด์ (`a1b2c3d...`) | **์์ฐจ์ ์ธ ์ ์ ๋ฒํธ (`r1, r2, r100`)** |
| **๋ถ๋ถ ์ฒดํฌ์์** | ์ ์ฅ์ ์ ์ฒด๋ฅผ ๋ฌด์กฐ๊ฑด clone ํด์ผ ํจ | **ํน์ ํ์ ๋๋ ํ ๋ฆฌ๋ง ๋จ๋
checkout ๊ฐ๋ฅ** |
| **ํ์ผ ์ ๊ธ (Lock)** | ์์น์ ์ผ๋ก ๋ถ๊ฐ๋ฅ (๋์ ํธ์ง ํ Merge) | **๋ฐ์ด๋๋ฆฌ ํ์ผ ๋
์ ์ ๊ธ(`svn lock`) ์๋ฒฝ ์ง์** |
| **์คํ๋ผ์ธ ์์
** | ๋ก์ปฌ์์ ์ปค๋ฐ, ๋ธ๋์น, ๋ก๊ทธ ์กฐํ ๊ฐ๋ฅ | **์๋ฒ ๋คํธ์ํฌ ๋จ์ ์ ์ปค๋ฐ ๋ถ๊ฐ๋ฅ** |
---
## 3. [์ด๋ณด์ 1๋จ๊ณ] 3๋ถ ํฌ๋ก์๋: ์ฒดํฌ์์๋ถํฐ ์ฒซ ์ปค๋ฐ๊น์ง (Hello World)
๋ก์ปฌ ํ
์คํธ์ฉ ์ ์ฅ์๋ฅผ ์์ฑํ๊ณ , ์์
์ฌ๋ณธ์ ์ฒดํฌ์์ํ์ฌ ํ์ผ์ ์ปค๋ฐํ๋ ์ ์ฒด ๋ผ์ดํ์ฌ์ดํด์
๋๋ค.
### โ ๋ก์ปฌ ํ
์คํธ ์ ์ฅ์ ์์ฑ ๋ฐ ํ์ค ๋ ์ด์์ ์ด๊ธฐํ
```bash
# 1. ๋ก์ปฌ ํ์ผ ๊ธฐ๋ฐ SVN ์ ์ฅ์ ์์ฑ
svnadmin create /tmp/svn-repo
# 2. ํ์ค 3๋ ๋๋ ํ ๋ฆฌ(/trunk, /branches, /tags) ์์ฑ
svn mkdir file:///tmp/svn-repo/trunk file:///tmp/svn-repo/branches file:///tmp/svn-repo/tags -m "ํ์ค ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ์์ฑ"
# ์ถ๋ ฅ: Committed revision 1.
```
### โก ์์
์ฌ๋ณธ ์ฒดํฌ์์ (Checkout)
```bash
# trunk ๋๋ ํ ๋ฆฌ๋ง ๋ก์ปฌ ์์
์ฌ๋ณธ์ผ๋ก ์ฒดํฌ์์
svn checkout file:///tmp/svn-repo/trunk my-project
cd my-project
# ์ถ๋ ฅ: Checked out revision 1.
```
### โข ํ์ผ ์์ฑ, ์ถ๊ฐ ๋ฐ ์ปค๋ฐ (Add & Commit)
```bash
# ์ ๊ท ํ์ผ ์์ฑ
echo "Hello, SVN World!" > hello.txt
# ๋ฒ์ ๊ด๋ฆฌ์ ํ์ผ ๋ฑ๋ก (svn add)
svn add hello.txt
# ์ถ๋ ฅ: A hello.txt
# ์ํ ํ์ธ (A: ์ถ๊ฐ ๋๊ธฐ)
svn status
# ์ถ๋ ฅ: A hello.txt
# ์ค์ ์ ์ฅ์๋ก ์ปค๋ฐ (svn commit)
svn commit -m "์ฒซ ๋ฒ์งธ ํ
์คํธ ํ์ผ ๋ฑ๋ก"
# ์ถ๋ ฅ:
# Adding hello.txt
# Transmitting file data .done
# Committing transaction...
# Committed revision 2.
```
### โฃ ๋ณ๊ฒฝ ์ด๋ ฅ ๋ก๊ทธ ํ์ธ (Log)
```bash
svn log
```
```text
------------------------------------------------------------------------
r2 | sulucky | 2026-10-10 22:20:00 +0900 (Sat, 10 Oct 2026) | 1 line
์ฒซ ๋ฒ์งธ ํ
์คํธ ํ์ผ ๋ฑ๋ก
------------------------------------------------------------------------
r1 | sulucky | 2026-10-10 22:19:30 +0900 (Sat, 10 Oct 2026) | 1 line
ํ์ค ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ์์ฑ
------------------------------------------------------------------------
```
---
## 4. [2๋จ๊ณ] ํต์ฌ ๊ธฐ๋ฅ: ์ผ์ ์์
& ์ํ ๊ธฐํธ ํด๋
(Daily Work & Diff)
### ๐ `svn status` ๊ธฐํธ ์์ ํด๋
ํ
`svn status` ์คํ ์ ํ์ผ๋ช
์์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ ์์
์ฌ๋ณธ์ ๋ณ๊ฒฝ ์ํ๋ฅผ ๋ํ๋
๋๋ค:
| ๊ธฐํธ | ์๋ฌธ ๋ช
์นญ | ์ํ ์ค๋ช
๋ฐ ๋์ฒ ๋ฐฉ๋ฒ |
| :---: | :--- | :--- |
| **`?`** | Unversioned | ๋ฒ์ ๊ด๋ฆฌ์ ํฌํจ๋์ง ์์ ์ ๊ท ํ์ผ โ `svn add` ๋๋ ignore ์ฒ๋ฆฌ |
| **`A`** | Added | ์ ์ฅ์์ ์ถ๊ฐ ์์ ์ํ (๋ค์ commit ์ ๋ฐ์) |
| **`M`** | Modified | ํ์ผ ๋ด์ฉ์ด ๋ก์ปฌ์์ ์์ ๋จ (๋ค์ commit ์ ๋ฐ์) |
| **`D`** | Deleted | ์ญ์ ์์ฝ ์ํ (`svn delete` ์คํ๋จ) |
| **`C`** | Conflict | **์ถฉ๋ ๋ฐ์!** ์๋ฒ ์๊ฒฉ๋ณธ๊ณผ ๋ก์ปฌ ์์ ๋ณธ์ด ์ถฉ๋ํจ โ ํด๊ฒฐ ํ์ |
| **`!`** | Missing | OS ๋ช
๋ น์ด๋ก ์์ ์ญ์ ๋จ โ `svn delete`๋ก ๊ณต์ ์ญ์ ํ๊ฑฐ๋ `svn revert`๋ก ๋ณต๊ตฌ |
| **`~`** | Type Replaced | ํ์ผ์ด ๋๋ ํ ๋ฆฌ๋ก ๋ฐ๋๋ ๋ฑ ๊ฐ์ฒด ํ์
์ด ๊ต์ฒด๋จ |
---
### ๐ป ์ผ์ ๊ฐ๋ฐ ํ์ ๋ช
๋ น์ด ์นํธ์ํธ
```bash
# [1] ์์
์์ ์ : ์๋ฒ์ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋ด ์์
์ฌ๋ณธ ๊ฐฑ์ (๋งค์ผ ์์นจ ํ์!)
svn update
# [2] ๋ด๊ฐ ์์ ํ ๋ด์ฉ๊ณผ ์๋ณธ์ ์ฐจ์ด์ ํ์ธ
svn diff
# ํน์ ํ์ผ๋ง diff ํ์ธ
svn diff hello.txt
# [3] ๋ก์ปฌ ์์ ์ ์ทจ์ํ๊ณ ์๋ฒ ์ํ๋ก ๋๋๋ฆฌ๊ธฐ (Undo)
svn revert hello.txt
# ํ์ฌ ๋๋ ํ ๋ฆฌ ์ดํ ๋ชจ๋ ์์ ์ ์ผ๊ด ๋กค๋ฐฑ
svn revert -R .
# [4] ํ์ผ ์ด๋ฆ ๋ณ๊ฒฝ ๋ฐ ์ด๋ (ํ์คํ ๋ฆฌ ๋ณด์กด)
svn move old-name.txt new-name.txt
# [5] ํ์ผ ์ญ์
svn delete obsolete.txt
# [6] ํน์ ๊ณผ๊ฑฐ ๋ฆฌ๋น์ (r2)์ ๋ด์ฉ์ ๋ก์ปฌ๋ก ์์ ํ์ธ
svn cat -r 2 hello.txt
```
---
## 5. [2๋จ๊ณ] ํต์ฌ ๊ธฐ๋ฅ: ๋ธ๋์น(Branch) & ํ๊ทธ(Tag) ๊ด๋ฆฌ (Branching & Tagging)
SVN์์ ๋ธ๋์น์ ํ๊ทธ๋ ๋
๋ฆฝ์ ์ธ ๋ฉ์ปค๋์ฆ์ด ์๋๋ฉฐ, ๋ด๋ถ์ ์ผ๋ก ์ ์ฅ์ ๊ฒฝ๋ก๋ฅผ ๋ณต์ฌํ๋ **์ ๋ ดํ ๋ณต์ฌ(Cheap Copy)**๋ก ๋์ํฉ๋๋ค. ํ๋๋งํฌ์ฒ๋ผ ๋ฉํ๋ฐ์ดํฐ๋ง ๋ณต์ฌํ๋ฏ๋ก ์ฉ๋์ ์ฐจ์งํ์ง ์์ต๋๋ค.
### โ ๋ธ๋์น ์์ฑ ๋ฐ ์ ํ (Branch & Switch)
```bash
# [1] trunk์์ ์๋ก์ด ๊ธฐ๋ฅ ๋ธ๋์น ์์ฑ (์๋ฒ ์์์ ์ฆ์ ๋ณต์ฌ)
svn copy file:///tmp/svn-repo/trunk file:///tmp/svn-repo/branches/feature-auth \
-m "์ธ์ฆ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ฉ ๋ธ๋์น ์์ฑ"
# [2] ๋ด ๋ก์ปฌ ์์
์ฌ๋ณธ์ ํด๋น ๋ธ๋์น๋ก ์ฆ์ ์ ํ (Switch)
# ์ ์ฒด๋ฅผ ๋ค์ ๋ฐ์ง ์๊ณ trunk์ ๋ธ๋์น์ ์ฐจ์ด์ ๋ง ๊ณ ์ ๊ฐฑ์ !
svn switch file:///tmp/svn-repo/branches/feature-auth
# ํ์ฌ ๋ด๊ฐ ์ด๋ ๋ธ๋์น๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋์ง ํ์ธ
svn info | grep URL
# URL: file:///tmp/svn-repo/branches/feature-auth
```
---
### โก ๋ธ๋์น ์์
ํ trunk๋ก ๋ณํฉ (Merge)
```bash
# 1. ๋ก์ปฌ ์์
์ฌ๋ณธ์ ๋ค์ trunk๋ก ์ ํ
svn switch file:///tmp/svn-repo/trunk
# 2. ์ต์ trunk ์ํ๋ก ๊ฐฑ์
svn update
# 3. feature-auth ๋ธ๋์น์์ ์์
๋ ๋ชจ๋ ์ปค๋ฐ์ trunk ์์
์ฌ๋ณธ์ผ๋ก ์๋ ๋ณํฉ
svn merge file:///tmp/svn-repo/branches/feature-auth
# 4. ๋ณํฉ ๊ฒฐ๊ณผ ํ์ธ ๋ฐ ์ต์ข
์ปค๋ฐ
svn diff
svn commit -m "feature-auth ๋ธ๋์น ๊ฐ๋ฐ ์๋ฃ โ trunk ๋ณํฉ"
```
---
### โข ๋ฆด๋ฆฌ์ฆ ํ๊ทธ ์์ฑ (Tag)
ํ๊ทธ๋ ์ ๋ ์์ ํ์ง ์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฆด๋ฆฌ์ฆ ์ค๋
์ท ๊ด๋ก์
๋๋ค:
```bash
svn copy file:///tmp/svn-repo/trunk file:///tmp/svn-repo/tags/v1.0.0 \
-m "ํ๋ก๋์
v1.0.0 ๋ฆด๋ฆฌ์ฆ ํ๊ทธ ์์ฑ"
```
---
## 6. [3๋จ๊ณ] ์ค๋ฌด ์์ฉ: ์ถฉ๋ ํด๊ฒฐ & ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋
์ ์ ๊ธ (Conflict & Locking)
### ๐ฅ ์ปค๋ฐ/์
๋ฐ์ดํธ ์ถฉ๋(Conflict) ์๋ฒฝ ํด๊ฒฐ๋ฒ
๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋จผ์ ์ปค๋ฐํ ๋ผ์ธ๊ณผ ๋ด๊ฐ ์์ ํ ๋ผ์ธ์ด ๊ฒน์น๋ฉด `svn update` ์ ๋ํํ ํ๋กฌํํธ๊ฐ ๋น๋๋ค:
```text
Conflict discovered in 'hello.txt'.
Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict,
(tc) theirs-conflict, (s) show all options:
```
| ์ ํ ์ต์
| ๋์ ์ค๋ช
|
| :---: | :--- |
| **`p`** (Postpone) | ์ถฉ๋์ ์ฐ๊ธฐํ๊ณ ํ์ผ ์์ `<<<<<<< .mine` ์ถฉ๋ ๋ง์ปค๋ฅผ ๋จ๊น (์๋ ๋ณํฉ์ฉ) |
| **`tc`** (Theirs Conflict) | ๋ด ์์ ์ ๋ฒ๋ฆฌ๊ณ **์๋ฒ(๋จ์ ๊ฒ)** ์ฝ๋๋ฅผ ์ ๋ฉด ์ฑํ |
| **`mc`** (Mine Conflict) | ์๋ฒ ๋ณ๊ฒฝ์ ๋ฎ์ด์ฐ๊ณ **๋ด ๋ก์ปฌ ์ฝ๋**๋ฅผ ์ ๋ฉด ์ฑํ |
| **`e`** (Edit) | ๊ธฐ๋ณธ ์๋ํฐ๋ฅผ ์ด์ด ์ถฉ๋ ๋ถ๋ถ์ ์ง์ ์ค์๊ฐ ์์ |
```bash
# p(์ฐ๊ธฐ)๋ฅผ ์ ํํ ๊ฒฝ์ฐ: ์ง์ ํ์ผ์ ์์ ํ ๋ค ์ถฉ๋ ํด๊ฒฐ ์ ์ธ
vi hello.txt # ์ถฉ๋ ๋ง์ปค(<<<<, ====, >>>>)๋ฅผ ์๋ ์ ๋ฆฌ
# SVN์๊ฒ "์ถฉ๋ ํด๊ฒฐ ์๋ฃ" ํต๋ณด
svn resolve --accept working hello.txt
# ์ ์ ์ปค๋ฐ ์๋ฃ
svn commit -m "์ถฉ๋ ์๋ ํด๊ฒฐ ํ ์ปค๋ฐ"
```
---
### ๐ ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋
์ ์ ๊ธ (Lock / Unlock)
ํ
์คํธ ํ์ผ๊ณผ ๋ฌ๋ฆฌ **์์
๋ฌธ์(`.xlsx`), ํฌํ ์ต ํ์ผ(`.psd`), 3D ๋ชจ๋ธ๋ง, ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ**๋ ์ค ๋จ์ ๋ณํฉ(Merge)์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. SVN์ ๋น๊ด์ ๋ฝ(Lock) ๊ธฐ๋ฅ์ผ๋ก ํ ๋ฒ์ ํ ๋ช
๋ง ์์ ํ๋๋ก ์ ๊ธ๋๋ค.
```bash
# [1] ํ์ผ์ ๋ฐฐํ์ ์ ๊ธ(Lock) ํ๋ (๋ค๋ฅธ ๊ฐ๋ฐ์๋ ์ปค๋ฐ ๋ถ๊ฐ)
svn lock design.psd -m "UI ๋์์ธ ์์ ์์ ์์
์ค์
๋๋ค."
# ์ถ๋ ฅ: 'design.psd' locked by user 'sulucky'.
# [2] ํ์ฌ ์ ๊ธ ์ํ ํ์ธ
svn status
# ์ถ๋ ฅ: K design.psd (K: ๋ด๊ฐ ๋ฝ์ ์ฅ๊ณ ์์ / O: ๋จ์ด ๋ฝ์ ์ฅ )
# [3] ์์ ๋ฐ ์ปค๋ฐ (์ปค๋ฐ ์๋ฃ ์ ์ ๊ธ์ด ์๋ ํด์ ๋จ)
svn commit -m "๋์์ธ ์์ ์
๋ฐ์ดํธ"
# [4] ์์
๋์ค ์๋์ผ๋ก ์ ๊ธ ๋ฐ๋ฉ (์์ ์ทจ์ ์)
svn unlock design.psd
# [5] ํด๊ฐ์/ํด์ฌ์์ ์ ๊ธ์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ๊ฐ์ ํด์ (Break Lock)
svn unlock --force design.psd
```
---
## 7. [3๋จ๊ณ] ์ค๋ฌด ์์ฉ: `svn:ignore` ๋ฐ ์์ฑ ๊ด๋ฆฌ (Properties)
Git์ `.gitignore` ํ์ผ ๋์ , SVN์ ๋๋ ํ ๋ฆฌ ์์ฒด์ **๋ฉํ๋ฐ์ดํฐ ์์ฑ(Property)**์ ๋ถ์ฌํฉ๋๋ค.
### ๐ซ ํน์ ํ์ผ/๋๋ ํ ๋ฆฌ ๋ฌด์ (`svn:ignore`)
```bash
# [1] ๋จ์ผ ํ์ผ์ด๋ ํจํด ๋ฌด์ ๋ฑ๋ก
svn propset svn:ignore "*.log" .
svn propset svn:ignore "node_modules" .
# [2] ์ฌ๋ฌ ์ค์ ๋ฌด์ ๋ชฉ๋ก์ ํ
์คํธ ์๋ํฐ๋ก ์ง์ ํธ์ง (๊ฐ์ฅ ์ถ์ฒ)
svn propedit svn:ignore .
# ์๋ํฐ๊ฐ ์ด๋ฆฌ๋ฉด ๋ฌด์ํ ํ์ผ/ํด๋๋ฅผ ํ ์ค์ฉ ์
๋ ฅ:
# target/
# build/
# *.class
# .env
# [3] ํ์ ๋ชจ๋ ๋๋ ํ ๋ฆฌ์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉ
svn propset svn:ignore -R "*.tmp" .
# [4] ์์ฑ ๋ณ๊ฒฝ ์ฌํญ๋ ๋ฐ๋์ ์ปค๋ฐํด์ผ ์๋ฒ์ ๋ฐ์๋จ!
svn commit -m "๋น๋ ์ํฐํฉํธ svn:ignore ์์ฑ ๋ฑ๋ก"
```
---
### ๐ ์ธ๋ถ ์ ์ฅ์ ์๋ธ๋ชจ๋ ์ฐ๋ (`svn:externals`)
๋ค๋ฅธ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฅ์๋ฅผ ํน์ ํด๋๋ก ์๋ ๋ง์ดํธํฉ๋๋ค:
```bash
svn propedit svn:externals .
# ์
๋ ฅ ํ์: <๋ก์ปฌํด๋๋ช
> <์๊ฒฉSVN_URL>
# lib/common file:///tmp/svn-repo/common/trunk
```
---
## 8. ์ค๋ฌด ์ฃผ์์ฌํญ & Git ๋ง์ด๊ทธ๋ ์ด์
(Troubleshooting & Git Interop)
### โ ๏ธ ์ด๋ณด์๊ฐ ๊ฐ์ฅ ํํ ๊ฒช๋ 5๋ ์ค์ ๋ฐ ํด๊ฒฐ์ฑ
| ์ฆ์ ๋ฐ ๋ฌธ์ ์ | ์์ธ ๋ถ์ | ํ์คํ ํด๊ฒฐ ๊ฐ์ด๋ |
| :--- | :--- | :--- |
| **์ปค๋ฐ ์ `Out of date` ์๋ฌ ๋ฐ์** | ์๊ฒฉ ์ ์ฅ์์ ๋ค๋ฅธ ์ฌ๋์ด ๋จผ์ ์ปค๋ฐ์ ์ฌ๋ฆผ | ์ปค๋ฐ ์ ํญ์ **`svn update`**๋ฅผ ๋จผ์ ์คํํ์ฌ ์ต์ ๋ฆฌ๋น์ ์ ๋ณํฉํ ํ ์ปค๋ฐ |
| **ํ์๊ธฐ์์ ์ง์ ํ์ผ ์ญ์ ํ `!` ์ํ๋ก ๊ณ ์ ** | SVN ์ถ์ ์ ๊ฑฐ์น์ง ์๊ณ OS ๋ ๋ฒจ์์ ํ์ผ ์ญ์ | `svn delete <file>`๋ก SVN์๊ฒ ์๋ฆฌ๊ฑฐ๋, ๋ณต๊ตฌํ๋ ค๋ฉด `svn revert <file>` |
| **`.svn` ํด๋๋ฅผ ์์ผ๋ก ๊ฑด๋๋ ธ๋ค๊ฐ ์์
์ฌ๋ณธ ์ ๊น** | ๋ด๋ถ sqlite DB ๋ฐ Pristine ํ์ผ ์์ | `svn cleanup` ๋ช
๋ น์ด๋ก ์์
์ฌ๋ณธ ๋ฝ์ ํ๊ณ ์ ๋ฆฌ |
| **์์
์ฌ๋ณธ ์ ์ฒด๊ฐ ๊นจ์ก๊ฑฐ๋ ๋ฉ์ถค (`Working copy locked`)** | ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ข
๋ฃ๋์ด ๋ฝ์ด ๋จ์ | ํ๋ก์ ํธ ๋ฃจํธ์์ **`svn cleanup`** ์คํ |
| **๊ณผ๊ฑฐ ํน์ ๋ฆฌ๋น์ ์ผ๋ก ์๊ตฌ ๋กค๋ฐฑํ๊ณ ์ถ์** | Git๊ณผ ๋ฌ๋ฆฌ ๋ฆฌ์
(reset) ๊ฐ๋
์ด ์์ | ์ญ๋ณํฉ(Reverse Merge) ์ํ: `svn merge -c -r15 .` ํ commit |
---
### ๐ `git-svn`์ผ๋ก Git ํ๊ฒฝ์์ SVN ์ ์ฅ์ ๋ค๋ฃจ๊ธฐ
์ฌ๋ด ์ธํ๋ผ๊ฐ SVN์ผ๋ก ๋ฌถ์ฌ ์์ด๋, ๋ก์ปฌ์์๋ Git์ ๊ฐ๋ ฅํ ๋ก์ปฌ ์ปค๋ฐ๊ณผ ๋ธ๋์นญ์ ๊ทธ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค:
```bash
# [1] SVN ์ ์ฅ์๋ฅผ ๋ก์ปฌ Git ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๋ณต์
git svn clone file:///tmp/svn-repo -s my-git-project
cd my-git-project
# [2] ๋ก์ปฌ์์๋ ์ผ๋ฐ Git์ฒ๋ผ ์์ ๋กญ๊ฒ ์์
git add .
git commit -m "๋ก์ปฌ ์คํ๋ผ์ธ ์ปค๋ฐ 1"
git commit -m "๋ก์ปฌ ์คํ๋ผ์ธ ์ปค๋ฐ 2"
# [3] SVN ์๋ฒ์ ์ต์ ๋ณ๊ฒฝ ์ฌํญ ํ (rebase)
git svn rebase
# [4] ๋ก์ปฌ Git ์ปค๋ฐ๋ค์ SVN ์ค์ ์๋ฒ๋ก ์ผ๊ด ํธ์
git svn dcommit
```
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์