42
Ying-Shiuan Pan 1 版本控制系統 --svn為例 2010/9/21

Intro to svn

Embed Size (px)

Citation preview

Page 1: Intro to svn

Ying-Shiuan Pan

1

版本控制系統--以svn為例

2010/9/21

Page 2: Intro to svn

Content

》為什麼需要版本控制系統?

》架設svn伺服器

》怎麼用?

基礎

基礎-2 (衝突的處理)進階 (branch & tag)補充

2

Page 3: Intro to svn

為什麼需要版本控制系統?

》專案沒辦法一個人完成

Alice, Bob, Chloe, Daniel… Alice傳檔給Bob說:

我完成了,接下來交給你

Bob傳檔給Chloe說:

我完成了,接下來交給你

Daniel要幹嘛?

Alice突然發現她有bug,怎麼辦?

「欸,最新版檔案在哪?我要改一下bug」3

Page 4: Intro to svn

為什麼需要版本控制系統?

》天有不測風雲

你怎麼備份你的程式碼? $ cp -R proj/* proj-20100901-1700/

$ tar -zxf proj-20100901-1700.tar.gz proj/

$ ./make_backup.py△壓縮、寄信、上傳、crontab定期執行……

》幹嘛不把這些精神用在寫程式上?

4

Page 5: Intro to svn

為什麼需要版本控制系統?

》人非聖賢,孰能無過;知錯能改

"Nobody really creates perfect code the first time... except me, but there is only one of me“ --Linus Torvalds

「Bob!昨天這功能還好的,怎麼又壞了」

Alice 解開昨天的版本、做diff、一一詢問

這些是誰改?

》幹嘛不把這些時間花在寫程式上?

5

Page 6: Intro to svn

有了版本控制軟體

6Alice Bob Chloe Daniel

v1v2v3v4v5v6v7

v1v2v3v4v5

v1v2v3v4

v1v2v3v4v5

Released 1.0

Page 7: Intro to svn

有了版本控制軟體

》Alice改好了 svn commit -m “[fixed] bug-0487”

》Bob要上一版 svn checkout URL -r r2

》Chloe要看誰改了他的code svn annotate

》Daniel發現昨天是好的,今天是爛的 svn diff r1 r2

7

Page 8: Intro to svn

有哪些版本控制軟體?

》No $$$$ CVS SVN GIT …

》$$$$ Bitkeeper Visual SourceSafe …

8

Page 9: Intro to svn

真的有人在用嗎?

》Linux, gcc, GNOME, KDE, pidgin, firefox,新酷音, …………

》Open Foundry PCMan, …

》Google code pcmanx, ibus, google chromium…

》 IBM, TSMC, OSLab…

9

Page 10: Intro to svn

SVN架構圖

10

CentralRepository

LocalWorkspace

LocalWorkspace

LocalWorkspace

LocalWorkspace

Page 11: Intro to svn

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

Page 12: Intro to svn

SVN使用步驟

》由SVN管理員建立一個svn repository》專案管理員先svn import》開發成員先checkout》開發成員開始開發

while (is_project_done == false) {

svn update

edit

svn update

svn commit

} 12

Page 13: Intro to svn

(admin) svnadmin create

》$ sudo apt-get install subversion

》$ mkdir ~/svn

》$ svnadmin create ~/svn/PROJ

13svn管理員 Central

Repository

create

Page 14: Intro to svn

(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

Page 15: Intro to svn

(Alice) svn checkout

》$ svn checkout file:///home/PM/proj ~/alice/proj

》$ cd ~/alice/trunk

15

專案開發者a

CentralRepository

checkout

Page 16: Intro to svn

(Bob) svn checkout

》$ svn checkout file:///home/PM/proj ~/bob/proj

》$ cd ~/bob/proj/trunk

16

Page 17: Intro to svn

Alice

》$ vim main.cint main()

{

return 0;

}

》$ svn add main.c

》$ svn commit r2

17

Page 18: Intro to svn

Alice

》$ vim main.cint main()

{

fn_a();

return 0;

}

void fn_a()

{

puts(“fn_a v1\n”);

}

》$ svn commit r3 18

Page 19: Intro to svn

Bob

》$ svn update

》$ vim bob.cvoid fn_b()

{

puts(“fn_b v1\n”);

}

》$ svn add bob.c

》$ svn commit r4

19

Page 20: Intro to svn

Bob

》$ vim main.cint main()

{

fn_a();

fn_b();

return 0;

}

....

》尚未commit

20

Page 21: Intro to svn

Alice

》$ svn update

》$ vim main.c....

void fn_a()

{

puts(“fn_a v2\n”);

}

》$ svn commit r5

21

Page 22: Intro to svn

Bob

》$ svn commit ……error!

》$ svn update

》$ cat main.c神奇的事情發生了!

阿阿阿阿阿阿阿!!

他居然合併了耶!!

》$ svn commit r6 22

Page 23: Intro to svn

(Alice) svn diff

》$ svn update !?我的main.c被改了,被改了什麼??

》$ svn log

》$ svn diff main.c -r 5不加版號是比對目前版本與base的差異

23

Page 24: Intro to svn

小結-1

》先update再改

》先update再commit確保可以編譯過再commit commit log一定要寫!

》基本上,以base版本為比較基準,沒有改到同一行的話,可以無痛合併

改到同一行,咩安抓?

24

Page 25: Intro to svn

Alice

》$ vim main.cint main()

{

fn_a();

fn_b2();

return 0;

}

》$ svn commit

25

Page 26: Intro to svn

Bob

//忘了先update,或是update之後別人有commit

》$ vim main.cint main()

{

fn_a();

fn_b5();

return 0;

}

》$ svn update !!!!!!!! Conflict!!!!!! 26

Page 27: Intro to svn

Bob

postpone: 延後處理

mc: 衝突部份接受自己的版本

tc: 衝突部份接受他人的版本

》延後處理會產生三個檔案: main.c.mine //自己的修改版

main.c.r10 //base版本

main.c.r11 //衝突版本27

文字介面才有!

Page 28: Intro to svn

Bob

》原本的main.c會變成……

28

自己修改的

別人修改的

Page 29: Intro to svn

衝突的解法

》溝通

》溝通

》溝通

》溝通

》溝通

》溝通

》溝通

29

廢話

Page 30: Intro to svn

衝突的解法

》溝通、討論完、編輯main.c》$ svn resolved main.c

會移除3個相關檔案.mine, .r10, .r11》…》$ svn commit

30

Page 31: Intro to svn

小結-2

》改到同一行會有衝突

》溝通、討論

》一定要svn resolved

31

Page 32: Intro to svn

branch & tag

》Branch暫時進行測試用的、除錯用的、開發新功能

》Tag stable、可以release的版本

32

Page 33: Intro to svn

branch & tag

33

trunk

branch-1

branch-1-1

merge

merge

mergemerge

1.0

1.11.2

tag2.0

Page 34: Intro to svn

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

Page 35: Intro to svn

小結-3

》版本(revision)號碼是線性成長,branch/tag的版本號碼與trunk共用

》merge 後branch或tag的資料夾依然存在

有需要,要自己svn rm》merge時,一樣可能發生衝突,請參閱小結-2

35

Page 36: Intro to svn

補充 - 哪些檔案要放上svn

》無法自動產生的

》程式碼

》Makefile》 configure》文件

》圖片、圖示!?

36

Page 37: Intro to svn

補充 - 哪些檔案不用放上svn

》可以自動產生的

》object file》執行檔

》如果你會寫autoconf,那Makefile、configure file也不用放 :p

37

Page 38: Intro to svn

補充 - 其他指令

》 svn status× 看哪些檔案被改過、衝突、等狀態

》 svn info× repository資訊

》 svn revert XXX× 拋棄檔案的修改內容

》 svn mkdir

》 svn mv (=rename, move, ren)

》 svn rm (=del, delete)× 這三項做完,別忘了要commit

38

Page 39: Intro to svn

補充 - 指令縮寫

》 checkout× co

》 commit× ci

》 status× stat, st

》 diff× di

》 annotate× ann

39

Page 40: Intro to svn

補充 - Svn GUI

》Windows TortoiseSVN

》Linux rapidsvn

40

Page 41: Intro to svn

有問題嗎?

41

Page 42: Intro to svn

參考資料

》 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