Upload
yingshiuan-pan
View
972
Download
1
Embed Size (px)
Citation preview
Ying-Shiuan Pan
1
版本控制系統--以svn為例
2010/9/21
Content
》為什麼需要版本控制系統?
》架設svn伺服器
》怎麼用?
基礎
基礎-2 (衝突的處理)進階 (branch & tag)補充
2
為什麼需要版本控制系統?
》專案沒辦法一個人完成
Alice, Bob, Chloe, Daniel… Alice傳檔給Bob說:
我完成了,接下來交給你
Bob傳檔給Chloe說:
我完成了,接下來交給你
Daniel要幹嘛?
Alice突然發現她有bug,怎麼辦?
「欸,最新版檔案在哪?我要改一下bug」3
為什麼需要版本控制系統?
》天有不測風雲
你怎麼備份你的程式碼? $ cp -R proj/* proj-20100901-1700/
$ tar -zxf proj-20100901-1700.tar.gz proj/
$ ./make_backup.py△壓縮、寄信、上傳、crontab定期執行……
》幹嘛不把這些精神用在寫程式上?
4
為什麼需要版本控制系統?
》人非聖賢,孰能無過;知錯能改
"Nobody really creates perfect code the first time... except me, but there is only one of me“ --Linus Torvalds
「Bob!昨天這功能還好的,怎麼又壞了」
Alice 解開昨天的版本、做diff、一一詢問
這些是誰改?
》幹嘛不把這些時間花在寫程式上?
5
有了版本控制軟體
6Alice Bob Chloe Daniel
v1v2v3v4v5v6v7
v1v2v3v4v5
v1v2v3v4
v1v2v3v4v5
Released 1.0
有了版本控制軟體
》Alice改好了 svn commit -m “[fixed] bug-0487”
》Bob要上一版 svn checkout URL -r r2
》Chloe要看誰改了他的code svn annotate
》Daniel發現昨天是好的,今天是爛的 svn diff r1 r2
7
有哪些版本控制軟體?
》No $$$$ CVS SVN GIT …
》$$$$ Bitkeeper Visual SourceSafe …
8
真的有人在用嗎?
》Linux, gcc, GNOME, KDE, pidgin, firefox,新酷音, …………
》Open Foundry PCMan, …
》Google code pcmanx, ibus, google chromium…
》 IBM, TSMC, OSLab…
9
SVN架構圖
10
CentralRepository
LocalWorkspace
LocalWorkspace
LocalWorkspace
LocalWorkspace
SVN架設
》1. svn伺服器
svn://xxx.xxx.xxx
》2. apache + dav_svn module http://os.csie.ncku.edu.tw/svn/proj http://tinyurl.com/28am6m
》3. local file file://var/svn/proj
11
SVN使用步驟
》由SVN管理員建立一個svn repository》專案管理員先svn import》開發成員先checkout》開發成員開始開發
while (is_project_done == false) {
svn update
edit
svn update
svn commit
} 12
(admin) svnadmin create
》$ sudo apt-get install subversion
》$ mkdir ~/svn
》$ svnadmin create ~/svn/PROJ
13svn管理員 Central
Repository
create
(PM) svn import
》$ mkdir /tmp/proj
》$ cd /tmp/proj
》$ mkdir trunk tags branches
》$ svn import ./ file:///home/PM/proj -m “initial import”
14專案管理員 CentralRepository
import
(Alice) svn checkout
》$ svn checkout file:///home/PM/proj ~/alice/proj
》$ cd ~/alice/trunk
15
專案開發者a
CentralRepository
checkout
(Bob) svn checkout
》$ svn checkout file:///home/PM/proj ~/bob/proj
》$ cd ~/bob/proj/trunk
16
Alice
》$ vim main.cint main()
{
return 0;
}
》$ svn add main.c
》$ svn commit r2
17
Alice
》$ vim main.cint main()
{
fn_a();
return 0;
}
void fn_a()
{
puts(“fn_a v1\n”);
}
》$ svn commit r3 18
Bob
》$ svn update
》$ vim bob.cvoid fn_b()
{
puts(“fn_b v1\n”);
}
》$ svn add bob.c
》$ svn commit r4
19
Bob
》$ vim main.cint main()
{
fn_a();
fn_b();
return 0;
}
....
》尚未commit
20
Alice
》$ svn update
》$ vim main.c....
void fn_a()
{
puts(“fn_a v2\n”);
}
》$ svn commit r5
21
Bob
》$ svn commit ……error!
》$ svn update
》$ cat main.c神奇的事情發生了!
阿阿阿阿阿阿阿!!
他居然合併了耶!!
》$ svn commit r6 22
(Alice) svn diff
》$ svn update !?我的main.c被改了,被改了什麼??
》$ svn log
》$ svn diff main.c -r 5不加版號是比對目前版本與base的差異
23
小結-1
》先update再改
》先update再commit確保可以編譯過再commit commit log一定要寫!
》基本上,以base版本為比較基準,沒有改到同一行的話,可以無痛合併
改到同一行,咩安抓?
24
Alice
》$ vim main.cint main()
{
fn_a();
fn_b2();
return 0;
}
》$ svn commit
25
Bob
//忘了先update,或是update之後別人有commit
》$ vim main.cint main()
{
fn_a();
fn_b5();
return 0;
}
》$ svn update !!!!!!!! Conflict!!!!!! 26
Bob
postpone: 延後處理
mc: 衝突部份接受自己的版本
tc: 衝突部份接受他人的版本
》延後處理會產生三個檔案: main.c.mine //自己的修改版
main.c.r10 //base版本
main.c.r11 //衝突版本27
文字介面才有!
Bob
》原本的main.c會變成……
28
自己修改的
別人修改的
衝突的解法
》溝通
》溝通
》溝通
》溝通
》溝通
》溝通
》溝通
29
廢話
衝突的解法
》溝通、討論完、編輯main.c》$ svn resolved main.c
會移除3個相關檔案.mine, .r10, .r11》…》$ svn commit
30
小結-2
》改到同一行會有衝突
》溝通、討論
》一定要svn resolved
31
branch & tag
》Branch暫時進行測試用的、除錯用的、開發新功能
》Tag stable、可以release的版本
32
branch & tag
33
trunk
branch-1
branch-1-1
merge
merge
mergemerge
1.0
1.11.2
tag2.0
branch & tag
》在svn中,branch跟tag的差別不大
》$ svn copy addr_from addr_to svn copy file:///svn/proj/trunk file:///svn/proj/branches/bug-8642
》$ svn merge addr_from addr_to
34
小結-3
》版本(revision)號碼是線性成長,branch/tag的版本號碼與trunk共用
》merge 後branch或tag的資料夾依然存在
有需要,要自己svn rm》merge時,一樣可能發生衝突,請參閱小結-2
35
補充 - 哪些檔案要放上svn
》無法自動產生的
》程式碼
》Makefile》 configure》文件
》圖片、圖示!?
36
補充 - 哪些檔案不用放上svn
》可以自動產生的
》object file》執行檔
》如果你會寫autoconf,那Makefile、configure file也不用放 :p
37
補充 - 其他指令
》 svn status× 看哪些檔案被改過、衝突、等狀態
》 svn info× repository資訊
》 svn revert XXX× 拋棄檔案的修改內容
》 svn mkdir
》 svn mv (=rename, move, ren)
》 svn rm (=del, delete)× 這三項做完,別忘了要commit
38
補充 - 指令縮寫
》 checkout× co
》 commit× ci
》 status× stat, st
》 diff× di
》 annotate× ann
39
補充 - Svn GUI
》Windows TortoiseSVN
》Linux rapidsvn
40
有問題嗎?
41
參考資料
》 Jserv - 淺談版本控制系統
http://blog.linux.org.tw/~jserv/archives/001148.html
》Version Control with Subversion http://www.csie.ntut.edu.tw/sdrc/files/cours
e/20061027/SVN.pdf