Intro to svn
Upcoming SlideShare
Loading in...5
×
 

Intro to svn

on

  • 1,130 views

 

Statistics

Views

Total Views
1,130
Views on SlideShare
1,129
Embed Views
1

Actions

Likes
3
Downloads
18
Comments
0

1 Embed 1

https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Intro to svn Intro to svn Presentation Transcript

  • 版本控制系統 --以svn為例 Ying-Shiuan Pan 2010/9/21 1
  • 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
  • 有了版本控制軟體 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
  • 有了版本控制軟體 》 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架構圖 Local Workspace Local Workspace Central Repository Local Workspace Local Workspace 10
  • 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 create svn管理員 Central 13 Repository
  • (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
  • (Alice) svn checkout 》$ svn checkout file:///home/PM/proj ~/alice/proj 》 $ cd ~/alice/trunk 專案開發者a checkout Central Repository 15
  • (Bob) svn checkout 》$ svn checkout file:///home/PM/proj ~/bob/proj 》 $ cd ~/bob/proj/trunk 16
  • Alice 》$ vim main.c int main() { return 0; } 》$ svn add main.c 》 $ svn commit  r2 17
  • Alice 》$ vim main.c int main() { fn_a(); return 0; } void fn_a() { puts(“fn_a v1n”); } 》$ svn commit  r3 18
  • Bob 》$ svn update 》 $ vim bob.c void fn_b() { puts(“fn_b v1n”); } 》$ svn add bob.c 》 $ svn commit  r4 19
  • Bob 》$ vim main.c int main() { fn_a(); fn_b(); return 0; } .... 》 尚未commit 20
  • Alice 》$ svn update 》 $ vim main.c .... void fn_a() { puts(“fn_a v2n”); } 》$ 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.c int main() { fn_a(); fn_b2(); return 0; } 》$ svn commit 25
  • Bob  //忘了先update,或是update之後別人有 commit 》$ vim main.c int 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 branch-1-1 merge branch-1 merge trunk tag merge merge 2.0 1.0 1.1 1.2 33
  • 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 》 可以自動產生的 》 objectfile 》 執行檔 》 如果你會寫autoconf,那Makefile、 configure file也不用放 :p 37
  • 補充 - 其他指令 》 svn status 》 svn mkdir × 看哪些檔案被改過、 》 svn mv (=rename, 衝突、等狀態 move, ren) 》 svn info 》 svn rm (=del, × repository資訊 delete) 》 svn revert XXX × 這三項做完,別忘了 × 拋棄檔案的修改內容 要commit 38
  • 補充 - 指令縮寫 》 checkout 》 annotate × co × ann 》 commit × ci 》 status × stat, st 》 diff × di 39
  • 補充 - Svn GUI 》 Windows  TortoiseSVN 》 Linux  rapidsvn 40
  • 有問題嗎? 41
  • 參考資料 》 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