tortoisesvn 的基本操作與使用 - ntut.edu.twwkchen/game/svn documents/svnover… ·...

4
TortoiseSVN 的基本操作與使用 Overview 當一個團隊開發軟體時,專案成員必須共享一套程式,如果沒有管理的工 具,則程式的整合會非常麻煩。本練習教導各位同學如何利用Subversion (SVN) 版本管理工具 1 ,共享你們的遊戲程式。如圖1所示,專案成員一律把程式放在SVN 伺服器 2 上,學生A想要修改程式時,必須先從SVN伺服器Checkout (簽出)專案的 工作副本(Working Copy) 至自己的電腦,所謂的工作副本就是實際在編輯的檔 案, 因此每次修改程式都是在自己的工作副本裡進行修改 ,完成修改並更新後將 程式Commit (簽入)SVN伺服器上;同理,學生B也是如此。這樣做,SVN伺服 器上就隨時會有一份最新版本的程式,而學生A與學生B就能隨時取得對方修改 過的程式,即使使用學校的電腦也能取得最新版本的程式TortoiseSVNSVN 伺服器的視窗介面,必須要安裝在電腦上 3 ,才能使用遠端的SVNTortoiseSVN 可以幫助你做CheckoutUpdate (更新)Commit,及其他管理工作。以下根據 不同的使用情境介紹,TortoiseSVN的使用流程。 1 Subversion 使用概念圖 1 其實 SVN 主要功能是版本管理,以下練習是介紹如何共享程式,因此,省略版本管理的功能。 2 已經為各位同學架好 SVN 伺服器,並設定好帳號、密碼,供整個學期使用。 3 學校的電腦應該已經安裝好 TortoiseSVN,如果沒有安裝請自行安裝。 1

Upload: others

Post on 20-Aug-2020

13 views

Category:

Documents


0 download

TRANSCRIPT

  • TortoiseSVN 的基本操作與使用 Overview

    當一個團隊開發軟體時,專案成員必須共享一套程式,如果沒有管理的工

    具,則程式的整合會非常麻煩。本練習教導各位同學如何利用Subversion (SVN)

    版本管理工具1,共享你們的遊戲程式。如圖1所示,專案成員一律把程式放在SVN

    伺服器2上,學生A想要修改程式時,必須先從SVN伺服器Checkout (簽出)專案的

    工作副本(Working Copy)至自己的電腦,所謂的工作副本就是實際在編輯的檔

    案,因此每次修改程式都是在自己的工作副本裡進行修改,完成修改並更新後將

    程式Commit (簽入)至SVN伺服器上;同理,學生B也是如此。這樣做,SVN伺服

    器上就隨時會有一份最新版本的程式,而學生A與學生B就能隨時取得對方修改

    過的程式,即使使用學校的電腦也能取得最新版本的程式。TortoiseSVN是SVN

    伺服器的視窗介面,必須要安裝在電腦上3,才能使用遠端的SVN。TortoiseSVN

    可以幫助你做Checkout、Update (更新)、Commit,及其他管理工作。以下根據

    不同的使用情境介紹,TortoiseSVN的使用流程。

    圖 1 Subversion 使用概念圖

    1 其實 SVN 主要功能是版本管理,以下練習是介紹如何共享程式,因此,省略版本管理的功能。 2 已經為各位同學架好 SVN 伺服器,並設定好帳號、密碼,供整個學期使用。 3 學校的電腦應該已經安裝好 TortoiseSVN,如果沒有安裝請自行安裝。

    1

  • 情境一:使用學校的電腦編寫程式

    由於學校的電腦在每次開機時,會還原硬碟裡的資料到原始狀態,曾經建立

    的工作副本也會被清除,因此,如圖2所示,每次到學校電腦教室,打開電腦第

    一件事就是從SVN伺服器簽出最新版本的程式碼,然後在自己的工作副本中編寫

    程式(Coding),課堂進行中,團隊中的任何一人,都可以在任意時間點,在更新

    (Update)後簽入自己的程式碼4,更新的目的是在取得從上次簽入到現在,將其

    他人已經簽入的修改加入到自己的工作副本中。

    萬一學生A與學生B編輯程式時,修改到同一個檔案(.h或.cpp)怎麼辦?自己

    的修改會被Update動作覆蓋嗎?如果學生A與學生B分別修改同個檔案的不同的

    地方,則當Update時,SVN會自動將二人的修改Merge (合併),因此二人的修改

    都會保留,不用擔心。但如果二個人同時改到同一行或同一段程式呢?在Update

    時,TortoiseSVN會出現Conflict (衝突)的訊息,較晚Commit的人必須負責解決

    Conflict (決定誰的修改才是正確的版本),然後才能完成Commit的動作。切記,

    離開教室前,一定要簽入有修改的程式碼5。

    圖 2 在學校電腦使用 TortoiseSVN 的流程

    4 通常我們只簽入原始碼,編譯的結果(例如:obj 檔或 exe 檔)則不會簽入 SVN 伺服器,只有在特殊情況(利入:正式釋出一個版本時)才會將編譯的結果簽入到 SVN,因此建議將 bin 及 obj 資料夾加到 ignore list 中。 5 每週至少將程式簽入至伺服器一次,每一組每週的程式行數,將依據伺服器的版本,自動計算。

    2

  • 情境二:第一次使用家裡的電腦編寫程式

    如果以前沒使用過TortoiseSVN,如圖3所示,回到家後先檢查家裡的電腦是

    否已經安裝TortoiseSVN,如果沒有安裝,請先至http://tortoisesvn.net/downloads下

    載最新版本的TortoiseSVN,然後安裝該程式在家裡的電腦。安裝完畢後,一樣

    先從SVN伺服器簽出(Check Out)最新版本的程式碼,TortoiseSVN會在家裡的電

    腦中建立工作副本,之後就可以在工作副本中進行程式的編輯,在任何時間點,

    都可以透過更新的動作,取得已經簽入的修改,當結束編輯時,記得簽入最後修

    改的程式碼,如此到學校後,馬上可以透過簽出的動作取得最新的版本。注意,

    工作副本不必刪除,也不要用將工作副本複製到隨身碟或上傳到網路空間的方式

    來共享程式碼,應該用簽出、更新和簽入等方式共享程式碼6。

    已安裝TortoiseSVN?

    安裝TortoiseSVN

    簽出程式碼(Check Out)

    回到家開機

    沒有安裝

    編輯程式(Coding)

    更新(Update)

    簽入(Commit)

    關機結束

    已安裝

    已安裝TortoiseSVN?

    安裝TortoiseSVN

    簽出程式碼(Check Out)

    回到家開機

    沒有安裝

    編輯程式(Coding)

    更新(Update)

    簽入(Commit)

    關機結束

    已安裝

    可交錯

    透過更新,A可取得B在家中所做的修改,B亦可取得A在家中所做的修改

    學生A 學生B

    圖 3 第一次在家中使用 TortoiseSVN 的流程

    6 如果在課堂中被發現使用網路空間或隨身碟等方式取得工作副本,會扣平時成績。

    3

    http://tortoisesvn.net/downloads

  • 情境三:第二次(或以後)使用家裡的電腦編寫程式

    在情境二中有提到工作副本不必刪除,因為只要有工作副本,TortoiseSVN

    就會檢查工作副本與伺服器上最新版本的差異(Difference),然後透過更新就可以

    只下載有修改的檔案,不像簽出是下載伺服器上最新版的所有檔案,所以當從學

    校回到家中時,如圖4所示,只需用更新(Update)就可以下載在學校所做過的修

    改,減少頻寬的使用和等待下載的時間,更新完後就可以編輯工作副本,一樣在

    簽入程式碼前先做更新的動作,取得其他人的修改後再做簽入的動作。

    更新(Update)

    回到家開機

    編輯程式(Coding)

    更新(Update)

    簽入(Commit)

    關機結束

    更新(Update)

    回到家開機

    編輯程式(Coding)

    更新(Update)

    簽入(Commit)

    關機結束

    可交錯

    透過更新,A可取得B在家中所做的修改,B亦可取得A在家中所做的修改

    透過更新,取得伺服器上最新的版本

    學生B學生A

    圖 4 非第一次在家中修改程式的流程

    特別注意事項

    千萬不要把 SVN 當 FTP 或隨身碟使用。SVN 是利用更新、簽入、簽出等方式操作的,而不是用拷貝(copy)的。如果用拷貝的方式將整個目錄

    複製到工作副本中時, SVN 的紀錄檔也會被蓋過去,造成 SVN 誤判工作副本

    的狀態,會導致 SVN 無法正確執行更新、簽入等動作。

    4

    /ColorImageDict > /JPEG2000ColorACSImageDict > /JPEG2000ColorImageDict > /AntiAliasGrayImages false /CropGrayImages true /GrayImageMinResolution 36 /GrayImageMinResolutionPolicy /Warning /DownsampleGrayImages true /GrayImageDownsampleType /Bicubic /GrayImageResolution 300 /GrayImageDepth -1 /GrayImageMinDownsampleDepth 2 /GrayImageDownsampleThreshold 2.00333 /EncodeGrayImages true /GrayImageFilter /DCTEncode /AutoFilterGrayImages false /GrayImageAutoFilterStrategy /JPEG /GrayACSImageDict > /GrayImageDict > /JPEG2000GrayACSImageDict > /JPEG2000GrayImageDict > /AntiAliasMonoImages false /CropMonoImages true /MonoImageMinResolution 36 /MonoImageMinResolutionPolicy /Warning /DownsampleMonoImages true /MonoImageDownsampleType /Bicubic /MonoImageResolution 600 /MonoImageDepth -1 /MonoImageDownsampleThreshold 1.00167 /EncodeMonoImages true /MonoImageFilter /CCITTFaxEncode /MonoImageDict > /AllowPSXObjects false /CheckCompliance [ /None ] /PDFX1aCheck false /PDFX3Check false /PDFXCompliantPDFOnly false /PDFXNoTrimBoxError true /PDFXTrimBoxToMediaBoxOffset [ 0.00000 0.00000 0.00000 0.00000 ] /PDFXSetBleedBoxToMediaBox true /PDFXBleedBoxToTrimBoxOffset [ 0.00000 0.00000 0.00000 0.00000 ] /PDFXOutputIntentProfile (None) /PDFXOutputConditionIdentifier () /PDFXOutputCondition () /PDFXRegistryName (http://www.color.org) /PDFXTrapped /False

    /CreateJDFFile false /Description >>> setdistillerparams> setpagedevice