第一部分: SVN使用
svn介紹
即subversion的簡稱。 版本控制系統(CVS)包括集中式版本控制系統(CVCS)和分布式版本控制系統(DCVS)。svn是集中式版本控制系統。 可以用於團隊合作。 svn用於托管代碼。
svn安裝
谷歌搜索菜鳥教程svn, 就可以搜索到相關信息。 主要步驟如下:
瀏覽器中打開: http://subversion.apache.org/packages.html#windows, 選擇最后一個安裝,進入點擊下載setup的, 然后得到下面的目錄文件:
將bin加入系統變量。 然后在cmd中運行 svnserve --help,如果正確則提示相應指令表示成功。
接着下載下面的小烏龜。
安裝即可。小烏龜的作用在於可以使我們操作svn。
說明: 第一個下載的是命令行操作,第二個下載的是GUN。 這里主要介紹命令行。
svn聲明周期
創建版本庫(create): 版本庫相當於一個集中的空間,用於存放開發者所有的工作成果。版本庫不僅能存放文件,還包括了每次修改的歷史,即每個文件的變動歷史。
檢出(checkout):Checkout 操作是用來從版本庫創建一個工作副本。工作副本是開發者私人的工作空間,可以進行內容的修改,然后提交到版本庫中。
更新(update):顧名思義,update 操作是用來更新版本庫的。讓我們假設 Tom 和 Jerry 是一個項目的兩個開發者。他們同時從版本庫中檢出了最新的版本並開始工作。此時,工作副本是與版本庫完全同步的。然后,Jerry 很高效的完成了他的工作並提交了更改到版本庫中。此時 Tom 的工作副本就過期了。更新操作將會從版本庫中拉取 Jerry 的最新改動並將 Tom 的工作副本進行更新。當然,這里的更新並不會把Tom的代碼弄掉,而是添加了最新版本的代碼,Jerry的新代碼保留不變。
執行變更(commit):執行變更最常用的就是編輯。你可以編輯代碼,你可以添加文件/目錄。但是這些添加的文件目錄不會立刻成為版本庫的一部分,而是被添加進待變更列表中,直到執行了 commit 操作后才會成為版本庫的一部分。Rename 操作可以更改文件/目錄的名字。“移動”操作用來將文件/目錄從一處移動到版本庫中的另一處。
復查變化(status): 當你檢出工作副本或者更新工作副本后,你的工作副本就跟版本庫完全同步了。但是當你對工作副本進行一些修改之后,你的工作副本會比版本庫要新。在 commit 操作之前復查下你的修改是一個很好的習慣。Status 操作列出了工作副本中所進行的變動。正如我們之前提到的,你對工作副本的任何改動都會成為待變更列表的一部分。Status 操作就是用來查看這個待變更列表。Status 操作只是提供了一個變動列表,但並不提供變動的詳細信息。你可以用 diff 操作來查看這些變動的詳細信息。
修復錯誤(revert): 也就是版本回退。我們來假設你對工作副本做了許多修改,但是現在你不想要這些修改了,這時候 revert 操作將會幫助你。Revert 操作重置了對工作副本的修改。它可以重置一個或多個文件/目錄。當然它也可以重置整個工作副本。在這種情況下,revert 操作將會銷毀待變更列表並將工作副本恢復到原始狀態。
解決沖突(resolve):合並的時候可能會發生沖突。Merge 操作會自動處理可以安全合並的東西。其它的會被當做沖突。例如,“hello.c” 文件在一個分支上被修改,在另一個分支上被刪除了。這種情況就需要人為處理。Resolve 操作就是用來幫助用戶找出沖突並告訴版本庫如何處理這些沖突。
提交修改(commit): Commit 操作是用來將更改從工作副本到版本庫。這個操作會修改版本庫的內容,其它開發者可以通過更新他們的工作副本來查看這些修改。
第二部分:svn常用操作
檢出
首先,cmd中進入你希望檢出到的文件夾,然后執行下面的命令,即
svn checkout <svn代碼地址> --username=<管理員分配給你的用戶名>
我們也可以寫成 svn co 這是svn checkout的簡寫形式
如下所示:
svn checkout http://svn.server.com/svn/project_repo --username=tom
輸入完成之后回車,會提示你輸入密碼,密碼輸入正確就可以將代碼檢出了。
如下所示:
最后會提示檢出的版本號:
如果你希望查看更多信息,可以使用svn info,如下所示:
遇到的問題: 提示D:\bbg不是工作副本。 因為,管理svn的是在bbg下面的wechattest中,所以應該cd wechattest,如下所示:
查看當前狀態
svn status
可以查看當前的狀態,如是否修改等。 如果完全沒有修改,那么就不會有任何提示。
添加文件
如果我們新建了一個文件或者添加了一個文件, 在提交之前需要首先添加到待變更列表中,如下所示:
svn add <文件名>
添加了之后,我們就可以通過svn status來檢查狀態了。
如下:
開始沒有任何變化,所以svn status是沒有任何結果的,緊接着我新建了一個test.txt文件, 然后檢查狀態,發現? , 表示該文件沒有添加到待變更列表中, 接着通過svn add <文件名>的方式添加文件到待變更列表中,此時,提示A, A表示成功將文件添加到待變更列表中。
提交文件
svn commit -m "第一次提交"
通過這個命令我們就可以提交文件了。其中的-m后面是一些提交文件的相關信息,方便我們以后作為參考。 如果不輸入-m, 那么就會出現多行輸入。
更新文件
svn update
一般在提交代碼前建議先更新,這樣可以避免沖突。
比較差異
svn diff
用於比較文件間的差異
回退文件
svn revert <文件名>
這樣可以回退到之前的版本
查看日志
svn log
可以查看日志
下面的部分摘自:SVN命令使用詳解
1、檢出
svn co http://路徑(目錄或文件的全路徑) [本地目錄全路徑]--username 用戶名 --password 密碼svn co svn://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名 --password 密碼
svn checkout http://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名
svn checkout svn://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名
注:如果不帶--password 參數傳輸密碼的話,會提示輸入密碼,建議不要用明文的--password 選項。
其中 username 與 password前是兩個短線,不是一個。
不指定本地目錄全路徑,則檢出到當前目錄下。
例子:
svn co svn://localhost/測試工具 /home/testtools --username wzhnsc
svn co http://localhost/test/testapp --username wzhnsc
svn checkout svn://localhost/測試工具 /home/testtools --username wzhnsc
svn checkouthttp://localhost/test/testapp --username wzhnsc
2、導出(導出一個干凈的不帶.svn文件夾的目錄樹)
svn export [-r 版本號] http://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名
svn export [-r 版本號] svn://路徑(目錄或文件的全路徑) [本地目錄全路徑] --username 用戶名
svn export 本地檢出的(即帶有.svn文件夾的)目錄全路徑 要導出的本地目錄全路徑
注:第一種從版本庫導出干凈工作目錄樹的形式是指定URL,
如果指定了修訂版本號,會導出相應的版本,
如果沒有指定修訂版本,則會導出最新的,導出到指定位置。
如果省略 本地目錄全路徑,URL的最后一部分會作為本地目錄的名字。
第二種形式是指定 本地檢出的目錄全路徑 到 要導出的本地目錄全路徑,所有的本地修改將會保留,
但是不在版本控制下(即沒提交的新文件,因為.svn文件夾里沒有與之相關的信息記錄)的文件不會拷貝。
例子:
svn export svn://localhost/測試工具 /home/testtools --username wzhnsc
svn export svn://localhost/test/testapp --username wzhnsc
svn export /home/testapp /home/testtools
3、添加新文件
svn add 文件名
注:告訴SVN服務器要添加文件了,還要用svn commint -m真實的上傳上去!
例子:
svn add test.php <- 添加test.php
svn commit -m “添加我的測試用test.php“ test.php
svn add *.php <- 添加當前目錄下所有的php文件
svn commit -m “添加我的測試用全部php文件“ *.php
4、提交
svn commit -m “提交備注信息文本“ [-N] [--no-unlock] 文件名
svn ci -m “提交備注信息文本“ [-N] [--no-unlock] 文件名
必須帶上-m參數,參數可以為空,但是必須寫上-m
例子:
svn commit -m “提交當前目錄下的全部在版本控制下的文件“ * <- 注意這個*表示全部文件
svn commit -m “提交我的測試用test.php“ test.php
svn commit -m “提交我的測試用test.php“ -N --no-unlock test.php <- 保持鎖就用–no-unlock開關
svn ci -m “提交當前目錄下的全部在版本控制下的文件“ * <- 注意這個*表示全部文件
svn ci -m “提交我的測試用test.php“ test.php
svn ci -m “提交我的測試用test.php“ -N --no-unlock test.php <- 保持鎖就用–no-unlock開關
5、更新文件
svn update
svn update -r 修正版本 文件名
svn update 文件名
例子:
svn update <- 后面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本
svn update -r 200 test.cpp <- 將版本庫中的文件 test.cpp 還原到修正版本(revision)200
svn update test.php <- 更新與版本庫同步。
提交的時候提示過期沖突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。
6、刪除文件
svn delete svn://路徑(目錄或文件的全路徑) -m “刪除備注信息文本”
推薦如下操作:
svn delete 文件名
svn ci -m “刪除備注信息文本”
例子:
svn delete svn://localhost/testapp/test.php -m “刪除測試文件test.php”
推薦如下操作:
svn delete test.php
svn ci -m “刪除測試文件test.php”
7、加鎖/解鎖
svn lock -m “加鎖備注信息文本“ [--force] 文件名
svn unlock 文件名
例子:
svn lock -m “鎖信測試用test.php文件“ test.php
svn unlock test.php
8、比較差異
svn diff 文件名
svn diff -r 修正版本號m:修正版本號n 文件名
例子:
svn diff test.php<- 將修改的文件與基礎版本比較
svn diff -r 200:201 test.php<- 對 修正版本號200 和 修正版本號201 比較差異
9、查看文件或者目錄狀態
svn st 目錄路徑/名
svn status 目錄路徑/名<- 目錄下的文件和子目錄的狀態,正常狀態不顯示
【?:不在svn的控制中; M:內容被修改;C:發生沖突;
A:預定加入到版本庫;K:被鎖定】
svn -v 目錄路徑/名
svn status -v 目錄路徑/名<- 顯示文件和子目錄狀態
【第一列保持相同,第二列顯示工作版本號,
第三和第四列顯示最后一次修改的版本號和修改人】
注:svn status、svn diff和 svn revert這三條命令在沒有網絡的情況下也可以執行的,
原因是svn在本地的.svn中保留了本地版本的原始拷貝。
10、查看日志
svn log 文件名
例子:
svn log test.php<- 顯示這個文件的所有修改記錄,及其版本號的變化
11、查看文件詳細信息
svn info 文件名
例子:
svn info test.php
12、SVN 幫助
svn help <- 全部功能選項
svn help ci <- 具體功能的說明
13、查看版本庫下的文件和目錄列表
svn list svn://路徑(目錄或文件的全路徑)
svn ls svn://路徑(目錄或文件的全路徑)
例子:
svn list svn://localhost/test
svn ls svn://localhost/test <- 顯示svn://localhost/test目錄下的所有屬於版本庫的文件和目錄
14、創建納入版本控制下的新目錄
svn mkdir 目錄名
svn mkdir -m "新增目錄備注文本" http://目錄全路徑
例子:
svn mkdir newdir
svn mkdir -m "Making a new dir." svn://localhost/test/newdir
注:添加完子目錄后,一定要回到根目錄更新一下,不然在該目錄下提交文件會提示“提交失敗”
svn update
注:如果手工在checkout出來的目錄里創建了一個新文件夾newsubdir,
再用svn mkdir newsubdir命令后,SVN會提示:
svn: 嘗試用 “svn add”或 “svn add --non-recursive”代替?
svn: 無法創建目錄“hello”: 文件已經存在
此時,用如下命令解決:
svn add --non-recursive newsubdir
在進入這個newsubdir文件夾,用ls -a查看它下面的全部目錄與文件,會發現多了:.svn目錄
再用 svn mkdir -m "添hello功能模塊文件" svn://localhost/test/newdir/newsubdir 命令,
SVN提示:
svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
path '/newdir/newsubdir '
15、恢復本地修改
svn revert [--recursive] 文件名
注意: 本子命令不會存取網絡,並且會解除沖突的狀況。但是它不會恢復被刪除的目錄。
例子:
svn revert foo.c <- 丟棄對一個文件的修改
svn revert --recursive . <-恢復一整個目錄的文件,. 為當前目錄
16、把工作拷貝更新到別的URL
svn switch http://目錄全路徑 本地目錄全路徑
例子:
svn switch http://localhost/test/456 . <- (原為123的分支)當前所在目錄分支到localhost/test/456
17、解決沖突
svn resolved [本地目錄全路徑]
例子:
$ svn update
C foo.c
Updated to revision 31.
如果你在更新時得到沖突,你的工作拷貝會產生三個新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
當你解決了foo.c的沖突,並且准備提交,運行svn resolved讓你的工作拷貝知道你已經完成了所有事情。
你可以僅僅刪除沖突的
參考文檔: http://wiki.jikexueyuan.com/project/svn/
第三部分:SVN問題處理
問題1:svn管理的代碼在修改后並沒有出現感嘆號,對勾等提示信息。
解決方法:參考這篇文章
這是解決問題之后的效果,
即通過對勾提示我們代碼沒有修改。
下面是常見符號的說明:
黃色感嘆號(有沖突):
--這是有沖突了,沖突就是說你對某個文件進行了修改,別人也對這個文件進行了修改,別人搶在你提交之前先提交了,這時你再提交就會被提示發生沖突,而不允許你提交,防止你的提交覆蓋了別人的修改。要解決沖突,如果你確認你的修改是無效的,則用TSVN還原你的修改就行了;如果認為你的修改是正確的,別人的提交是無效的,那么用TSVN先標記為“解決沖突”,然后就可以提交了;如果你認為你的修改和別人的修改都有一部分是有效的,那么你就把別人的修改手動合並到你的修改中,然后使用TSVN標注為“解決沖突”,然后就可以提交了。進入文件夾,尋找有黃色感嘆號的文件,這些文件就是發生沖突的地方,根據實際情況處理沖突
米字號(有本地修改代碼):
--這是說明你有未提交的本地代碼。
問號(新加入的資源):
--這說明該文件是項目中新增文件資源,新增資源可以是文件、圖片、代碼等。
紅色感嘆號(本地代碼與庫沒有保持一致):
--這說明本地代碼跟庫上沒有保持一致,如果用戶想修復,可以將帶紅色感嘆號圖標文件刪除,直接update即可。
灰色向右箭頭(本地修改過)
--本地代碼沒有及時上庫。
藍色向左箭頭(SVN上修改過)
--記得更新代碼后修改,提交前跟svn對比習慣。
灰色向右且中間有個加號的箭頭(本地比SVN上多出的文件)
--修改完記得跟svn保持一致
藍色向左且中間有個加號的箭頭(SVN上比本地多出的文件)
--刪除該文件后,再次更新,將svn上文件全部更新下來。
灰色向右且中間有個減號的箭頭(本地刪除了,而SVN上未刪除的文件)
--也就是說你刪除確認后,一定要記得上庫,跟svn保持一致
藍色向左且中間有個減號的箭頭(SVN上刪除了,而本地未刪除的文件)
--比對svn庫上代碼,確定需要刪除后,更新svn(刪除無用代碼)。
紅色雙向箭頭(SVN上修改過,本地也修改過的文件 )
--這個表示本地和svn上都修改過,最好就是把本地修改合並到svn,修改代碼前最后先更新。