星期二, 七月 10, 2007

SVN 基本指令教學

SVN 的基本指令介紹, 主要參考自下述:

主要 SubTrain 的 PPT 前面頁數看一看, 基礎就大概都知道了, 後面頁數太進階了, 目前用不到, 以後再看. XD

PS: 如果不知道 SVN 是什麼, 可見此文: 淺談版本控制系統, 裡面連結檔案看完, 應該就很清楚了 :)

先來看 SVN Trunk/Tags/Branches 目錄 的 架構 和 用途:(英文說明轉載自 SubTrain PPT)

  • trunk: Main line of development(主幹, 主要開發都由在 trunk)
  • tags: Releases (想要 Release 的時後, 就標個 Tag, 以後可以依 Tag 來找回之前版本的資料)
  • branches: Preparation of release, bug fixing(分支, 可以將某些功能切出來, 或者 bug fix 等切成分支, 等做完後再用 Merge 合併回來)

SVN 基本功能:

Import: 將整個 project_directory 的資料 import 進 svn 裡面

  • svn import project_directory http://DOMAIN/svn_project
  • svn import project_directory file:///SVN_PATH/svn_project

Checkout: (checkout 可簡寫成 co), 將資料 checkout 回來

  • svn co http://SVN_PATH/svn_project
  • svn co file:///SVN_PATH/svn_project
  • svn co -r 12 file:///var/lib/svn/dev/projects # 出第12版的 projcets code

List: (list 可簡寫成 ls), 看上面有哪些檔案/資料

  • svn ls http://SVN_PATH/svn_project
  • svn ls file:///SVN_PATH/svn_project

Update: (update 可簡寫成 up), 將目前資訊更新成 SVN 線上最新版本.

  • SVN_CHECKOUT_DIR$ svn up
Commit: (commit 可簡寫成 ci), 將目前所做的修改 commit 回 svn
  • SVN_CHECKOUT_DIR$ svn ci
Status: (status 可簡寫成 st), 看目前檔案/結構 跟 SVN 線上的版本有哪些不同
  • SVN_CHECKOUT_DIR$ svn st
Add: 將此 檔案/目錄 新增進 svn
  • SVN_CHECKOUT_DIR$ svn add filename 或 svn add directory
MV: 改檔名, 並且此檔案之前紀錄還要繼續留下
  • SVN_CHECKOUT_DIR$ svn mv filename new_filename
Revert: 還原這次的修改, 回到前一版的檔案狀態(未 commit 前可用)
  • SVN_CHECKOUT_DIR$  svn revert [file | directory]

SVN 檔案狀態資訊:

  • ?: 此檔案不存在 SVN 裡面
  • A: 此次新增的檔案
  • C: 此檔案已經有人改過, 合併不成功, 需要人工介入
  • D: 此次移除的檔案
  • M: 此檔案有修改過
  • U: 此檔案有被更新過

再來是比較進階一點點, 下述範例轉載自 SubTrain 的教學 PPT:

建立一個 branch

  • svn copy http://svnserver/calc/trunk http://svnserver/calc/branches/my-calc-branch -m 'create a branch' 

建立 Release Tags:

  • svn copy http://svnserver/calc/trunk http://svnserver/calc/tags/Release-1.0.0 -m 'create Release tags for Release 1.0.0'

合併兩個版本的檔案 # 參考自: 用 Subversion 的 Merge 來 Undo

  • svn merge -r REV1:REV2 {path/to/workingcopy}
  •  (UNDO) svn merge -r 1234:1233 . .
  •  (MERGE)svn merge -r 1233:1234 . .
  • svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
有 "C" 狀態處理完後, 用 resolved  將自動產生的檔案刪除, 才能正常 commit:
  • svn resolved filename # 這樣子下就會把自動產生 diff 等的檔案刪除

找版本間有什麼不同 diff:

  • svn diff # 自動以現在檔案跟 SVN 內最新版做 diff
  • svn diff -r9237:9238
Info: 列出現在路徑, 版本編號, 最後一次修改日期 ... 等資訊
  • svn info

Log: 如果沒輸入參數, 預設會把所有 commit log 都列出來

  • svn log

Propset (propset, pset, ps): 版本控制都有些特殊 Keyword 設定, 如 Id 就是最常用的, 設定方法如下:

  1. 在檔案內找地方加入 $Id$
  2. 設定此檔案要能吃 Id 的 Keyword: svn ps svn:keywords 'Id' filename (只需設一次即可, 之後就不用再設)
  3. svn ci 後, $Id$ 會自動代換成 $Id:filename 編號 年月日時分秒 username $ 的資訊
  4. svn help ps 可以看到有哪些 Keyword 可以用, 即 Keyword 的說明.(ex: URL, Author, Date, Rev, Id 等.)

其它 SVN Client:

SVK 相關介紹:

其它相關網頁

相關標籤

this is comment icon [回覆]

對不起… 請教一下
我在 server 上下了 svn import 原始程式碼 http://..
用烏龜 commit 之後,commit 都ok
用網頁去連(http://xx/svn/project_name)看見也是新的版本
原始程式碼卻沒有更動
請問該怎麼辦?

Comment by timeternity (04/29/2008 15:38)

this is comment icon 回 timeternity [回覆]

svn update 要做更新才會動呀~ XD

Comment by Tsung (04/29/2008 15:40)

this is comment icon [回覆]

我把我的步驟再清楚地描述一下好了:
原始碼放在 /var/www/project
svn 放在 /home/svn/project

server 上下指令:svn import /var/www/project http://localhost/svn/project

然後在 windows 上用烏龜 checkout,改好後 commit

然後在 http://serverIP/svn/project 輸入帳號密碼後可以看見已經成功更新的程式碼目錄及檔案

但是 /var/www/project 裡的檔案卻是沒有更新

svn up 不是指的是更新 client 端的檔案嗎?
還是要下怎樣的指令才會更新 svn 裡的檔案到 /var/www/project?

謝謝您抽空指教,感謝!

Comment by timeternity (04/29/2008 17:13)

this is comment icon 回 timeternity [回覆]

喔, 原來如此... 這是觀念的問題... XD
你既然已經 import, 那你原始目錄就可以砍掉了, 那個已經沒用了.
你需要做的是 svn co http://localhost/svn/project /var/www/project
然後之後有更新的話, 就 cd/var/www/project;svn up 即可. :)

Comment by Tsung (04/29/2008 17:42)

this is comment icon [回覆]

謝謝您的指教

想再請問一下,svn 是否有選項能夠在 commit 之後自動把程式碼 export 到 /var/www/project 下呢?

Comment by timeternity (04/30/2008 10:28)

this is comment icon 回 timeternity [回覆]

沒有, 不過 SVN 在遇到這種狀況, 有很多已經遇先想好的處理.
你找 /home/svn/project/hooks/post-commit.tmpl, 把這個 改名成 post-commit, 之後再加上 svn export 等指令就可以做到了 :)

Comment by Tsung (04/30/2008 11:40)

this is comment icon [回覆]

感謝前輩的回答

能否再請教一下…
SVN 是不是無法紀錄檔案的權限?

我在 linux 下檔案權限改好(chmod)以後,commit 再 export/checkout,發現檔案權限沒有修改成功
如果想要操作 svn 裡原始碼檔案的權限(用烏龜或是linux下操作),請問該怎麼做呢…

(我有找了相關的連結,但都沒看到相關的指令)

謝謝您

Comment by timeternity (04/30/2008 12:05)

this is comment icon 回 timeternity [回覆]

嗯, 這個問題我也無解, 我的做法是, 先從 svn delete 掉後, 改完權限再 svn add & commit 上去.
他只記得剛開始 add 後的權限(我的測試是這樣子).
如果您有找到解法, 還請跟小弟說一下.. Orz..

Comment by Tsung (04/30/2008 14:54)

this is comment icon [回覆]

我稍微找了一下解決方案:http://www.fwolf.com/blog/post/258
及 google://svn chmod 出來的一些 link

這問題其他人在以前就問過了
但似乎都無解

不過利用 post-commit,設定 commit 後自動 chmod
還算可以解決這問題

Comment by timeternity (05/01/2008 11:19)

this is comment icon 回 timeternity [回覆]

呵呵, 這招也是很有趣, 我是都用之前說的方法, 不然就是寫 .sh 來做 chmod 的動作, 都忘了有 post-commit 可以用了, 感恩~ :)

Comment by Tsung (05/01/2008 12:20)

this is comment icon [回覆]

補充此教學有關 post-commit 的解說以及注意事項
http://cwlin0416.wordpress.com/2007/04/13/subversion-and-web-development/

Comment by timeternity (05/02/2008 11:27)

this is comment icon 回 timeternity [回覆]

感謝提供此網頁, 已於文章補上此連結~ 感恩. Orz..

Comment by Tsung (05/02/2008 19:34)

this is comment icon 如何自動更新一整個目錄? [回覆]

妳好,像你請問一下,若是下面有一堆目錄,可以新增檔案或者是目錄,可以用svn import,來自動完成嗎?

謝謝您!

Comment by little1981 (05/22/2008 10:12)

this is comment icon 回 little1981 [回覆]

import 是在第一次使用的, 之後就不行了, 之後都要用 add 的, 不過應該可以 add *, 他會自動判斷, 已經加過的就不會再加進去了~
這樣子應該跟 import 差不多吧? :)

Comment by Tsung (05/22/2008 10:31)

this is comment icon [回覆]

後來執行了svn add /www/jsp/a/*
ANS:svn: '/www/jsp/a' 不是工作副本
svn: 無法開啟檔案 '/www/jsp/a/.svn/entries': 沒有此一檔案或目錄

是因為當初沒有先從SVN機器上checkout嗎?
謝謝你的回答

Comment by little1981 (05/22/2008 18:17)

this is comment icon 回 little1981 [回覆]

嗯, 要 checkout 出來後, 才可以再做 add. :)

Comment by Tsung (05/22/2008 18:24)

this is comment icon [回覆]

不好意思再請問一下
那有沒有可能可以用svn import來達成呢?
因為之前用cvs的時候是可以用omport的方式去達成
謝謝你!!

Comment by little1981 (05/23/2008 11:43)

this is comment icon 回 little1981 [回覆]

可以阿, svn rm * 再 svn import 倒是可以做到.. 不過這樣子就沒有版本控制的意義了.
或許您可以參考 http://plog.longwin.com.tw/programming/2007/11/02/svn_add_all_new_file_script_2007
這邊有簡單的 script, 可以讓您將新的檔案都變 add, 再 commit 即可.

Comment by Tsung (05/23/2008 15:18)

this is comment icon [回覆]

我後來持續測試之後,發現就是在client使用TortoiseSVN
在目錄上層按下svn COMMIT,可是他會彈出一個視窗
讓你選擇有異動的檔案
不知道這個部份,要怎麼用指令表示呢?
svn commit path ??

因為svn COMMIT可以直接幫你判別是新增還是修改或者是刪除

真的很謝謝你!

Comment by little1981 (05/23/2008 15:41)

this is comment icon [回覆]

"這邊有簡單的 script, 可以讓您將新的檔案都變 add, 再 commit 即可"

這樣的話只解決掉新增的問題
但是修改跟刪除的話,用svn add是沒有用的
變成需要用到svn update跟svn delete

謝謝!

Comment by little1981 (05/23/2008 15:47)
Add this page to del.icio.us Add this page to Yahoo Taiwan's bookmark Add this page to MyShare

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~