Intro to svn

1,153 views
1,000 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,153
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
19
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Intro to svn

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

×