Subversion (SVN) 雖然不如 Git 流行,但許多企業專案仍在使用。本文整理 SVN 核心指令、常用工作流、衝突解決、屬性操作,作為終端機快速查閱手冊。
基礎工作流指令
| 操作 | 指令 | 說明 |
| 棧出專案 | svn checkout URL [PATH]
svn co URL | 從版本庫下載工作副本 |
| 更新到最新版 | svn update [PATH]
svn up | 同步版本庫變更到本地 |
| 更新到特定版本 | svn update -r REV PATH | 如 svn up -r 200 file.c |
| 提交變更 | svn commit -m "LOG" [PATH]
svn ci -m "LOG" | 將本地變更送回版本庫 |
| 新增檔案/目錄 | svn add FILE... | 納入版本控管(下次 commit 生效) |
| 刪除檔案/目錄 | svn delete PATH
svn del/rm | 標記刪除(下次 commit 生效) |
| 移動/重命名 | svn move SRC DST
svn mv/rename | 保留歷史記錄的移動 |
| 複製(建立分支/標籤) | svn copy SRC DST -m "LOG"
svn cp | 常用於建立分支/標籤 |
狀態查詢與差異比較
| 操作 | 指令 | 說明 |
| 查看工作副本狀態 | svn status [PATH]
svn st | 顯示本地修改狀態(見下表狀態碼) |
| 詳細狀態(含版本號、作者) | svn status -v [PATH] | 顯示工作版本、最後修改版本、作者 |
| 比較本地與基礎版本差異 | svn diff [PATH]
svn di | 顯示未提交的修改內容 |
| 比較兩個版本差異 | svn diff -r REV1:REV2 [PATH] | 如 svn diff -r 200:201 file.c |
| 查看提交日誌 | svn log [PATH] | 顯示歷史提交記錄 |
| 查看檔案詳細資訊 | svn info [PATH] | URL、版本庫根、UUID、版本、作者、時間等 |
| 列出版本庫目錄內容 | svn list URL
svn ls | 不需 checkout 即可瀏覽 |
svn status 狀態碼對照
| 碼 | 含義 |
(空白) | 正常,無變更 |
A | 已排程新增 |
D | 已排程刪除 |
M | 內容被修改 |
R | 已排程取代(刪除+新增) |
C | 衝突 |
? | 未納入版控 |
I | 被忽略 |
X | 外部定義 |
K | 被鎖定 |
鎖定與衝突解決
| 操作 | 指令 | 說明 |
| 鎖定檔案 | svn lock -m "MSG" FILE | 獨佔編輯權(需版本庫支援) |
| 解除鎖定 | svn unlock FILE | 釋放鎖定 |
| 解決衝突標記 | svn resolved PATH | 移除衝突狀態,允許提交(需手動解決內容後執行) |
| 還原本地修改 | svn revert PATH | 捨棄本地未提交變更,恢復基礎版本 |
| 合併版本區間變更 | svn merge -r REV1:REV2 PATH | 將版本區間差異合併到當前工作副本 |
分支與標籤管理
# 建立分支(在版本庫端直接複製,極快)
svn copy ^/trunk ^/branches/feature-x -m "建立 feature-x 分支"
# 建立標籤(唯讀快照)
svn copy ^/trunk ^/tags/release-1.0 -m "發布 1.0"
# 切換工作副本到分支
svn switch ^/branches/feature-x
# 將分支變更合併回 trunk(在 trunk 工作副本執行)
svn merge ^/branches/feature-x
# 合併特定版本區間
svn merge -r 100:200 ^/branches/feature-x
版本庫 URL 變更
# 情境一:伺服器 IP/域名變更,路徑不變
svn switch --relocate https://old-svn/repo https://new-svn/repo
# 情境二:專案在版本庫內移動位置
svn switch https://svn/repo/new-path
離線可用指令(無需網路)
以下指令僅讀取本地 .svn 中繼資料,無需連線版本庫:
svn status
svn diff
svn revert
svn info(顯示本地快取資訊)
實用別名建議(加入 ~/.bashrc)
alias svnst='svn status'
alias svnup='svn update'
alias svnci='svn commit -m'
alias svndiff='svn diff'
alias svnlog='svn log --limit 20'
alias svnadd='svn add --force * # 遞迴新增所有未版控檔案'
常見問題排查
- 提交時顯示「Out of date」:先
svn up、解決衝突、再 svn ci。
- 樹狀衝突:目錄結構變更衝突,需手動處理
svn resolve 或刪除重新 checkout。
- 鎖定失效:
svn cleanup 清理殘留鎖定,或管理員 svnadmin lslocks 強制釋放。
- 大檔案提交失敗:調整
httpd.conf LimitXMLRequestBody、LimitRequestBody 或使用 svnadmin dump/load 遷移。
SVN 核心哲學:集中式、原子提交、目錄版本化、廉價複製。掌握 checkout → update → edit → add/del → diff → commit → log 循環,配合 branch/merge 工作流,即可駕馭大多數企業專案版控需求。