Perforce - Version Control System

1、前言

Perforce Software - The Fast Software Configuration Management System 是一個版本控制系統,功能相當好用,可惜授權金太高不過因為此次實作為安裝、測試、還原,且在 Perforce 官網 有說明 which allows only two users and five client workspaces when used without a license. 也就是若沒有授權的 perforce server 仍然可以正常使用只是僅限於 2 使用者帳號及 5 個客戶端工作設定,所以我們也可安裝來體驗一下 perforce 的威力。


若是不了解什麼是版本控制系統則可看 蔡煥麟-版本控制系統的基礎觀念 此篇對於什麼是版本控制寫的簡短有力是適合入門的好文章。





文章目錄

1、前言
2、作業環境
3、安裝及設定
          步驟1.安裝 perforce 套件
          步驟2.修改 perforce 設定檔
          步驟3.啟動 perforce 服務
          步驟4.建立 perforce super user 帳號密碼
          步驟5.建立 perforce 一般使用者帳號及密碼
          步驟6.建立檔案庫 (Repository)
4、備份及還原 Depot
          備份 Perforce 說明
          還原 Perforce 說明
5、參考
6、Me FAQ
          Q1.啟動 perforce 後沒反應?
          Q2.還原 checkpoint 及 Depot 後啟動 perforce 沒反應?





2、作業環境

  • FreeBSD 6.2-RELEASE
  • perforce-06.2_3,1 





3、安裝及設定

步驟 1. 安裝 perforce 套件

在 ports tree 中也已經將 perforce 納入了,所以我們可以很方便的安裝 perforce server。
cd /usr/ports/devel/perforce  //切換至安裝路徑
make install clean             //安裝並清除暫存檔案 

在安裝結尾時會出現如下訊息提醒您說記得檢查 Kernel 內 COMPAT_FREEBSD5 是沒有被註解 (mark) 掉的,否則 perforce 運作可能會有問題。
 *******************************************
 * Do not forget to add COMPAT_FREEBSD5 into *
 * your kernel configuration (enabled by default). *
 * To configure and recompile your kernel see: *
 * http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html*
 ******************************************

安裝完成後我們可以打 pkg_info -L 指令,來查看 perforce 安裝哪些相關執行檔及設定檔在系統中。
pkg_info -L perforce-06.2_3,1
 Information for perforce-06.2_3,1:
 Files:
 /usr/local/bin/p4                    //Perforce Command-Line Client
 /usr/local/sbin/p4d                  //Perforce Server
 /usr/local/sbin/p4ftpd               //Perforce FTP Client
 /usr/local/sbin/p4p                  //Perforce Proxy Server
 /usr/local/sbin/p4web                //Perforce Web Client
 /usr/local/etc/perforce.conf.default //Perforce config file
 /usr/local/etc/rc.d/perforce.sh      //start perfoce service shell

在安裝 perforce 過程中會自動新增 p4admin 這個 user 及 group 在系統中,所以 perforce 目錄及服務都由這個 user 及 group 來管理,預設 perforce 運作目錄及路徑如下
 /usr/local/perforce                  //default Directory
 /usr/local/perforce/root             //default Perforce ROOT Directory
 /usr/local/perforce/logs             //default Perforce Log Directory




步驟 2. 修改 perforce 設定檔

設定檔的內容很直覺以下我只列出我修改的部份。
vi /usr/local/etc/perforce.conf
 #PERFORCE_ROOT="/usr/local/perforce/root"   //P4ROOT 的路徑 (預設值)
 PERFORCE_ROOT="/home/perforce/root"         //修改後
 #PERFORCE_PORT="1666"    //Listen Port 1666 (預設值)
 PERFORCE_PORT="2666"     //修改後 Listen Port 2666
 #PERFORCE_OPTIONS="-d -p $PERFORCE_PORT -v server=1 -L /usr/local/perforce/logs/p4d.log"  //預設值
 PERFORCE_OPTIONS="-d -p $PERFORCE_PORT -v server=1 -L /home/perforce/logs/p4d.log" //修改 log 存放路徑
 #PERFORCE_START=yes      //預設值
 PERFORCE_START=yes       //修改為可啟動




步驟 3. 啟動 perforce 服務

修改完設定檔後就來啟動服務吧,啟動服務成功後會在 P4ROOT 目錄下建立許多 db.* 及 journal 檔 (我的例子是 /home/perforce/root),並建立 p4d.log 檔 (我的例子是 /home/perforce/logs/p4d.log)。
/usr/local/etc/rc.d/perforce.sh start
 p4dPerforce db files in '/home/perforce/root' will be created if missing...
 Perforce Server starting...

檢查 perforce 是否啟動成功,我的設定為 Listen port 2666。
sockstat
 USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
 p4admin  p4d        71700 3  tcp4   *:2666                *:*

檢查 perforce process 是否執行。
ps ax | grep p4d
 71700  p3  I      0:00.00 /usr/local/sbin/p4d -r /usr/local/perforce/root -d -p 2666 -v server=1 -L /usr/local/perforce/logs/p4d.log

檢查 p4d.log 內容看 perforce server 訊息。
cat /home/perforce/logs/p4d.log
 Perforce server info:
    Perforce db files in '/home/perforce/root' will be created if missing...
 Perforce server info:
    Perforce Server starting 2007/12/04 13:49:52 pid 71790 P4D/FREEBSD54X86/2006.2/136821.

查看 perforce server 版本及授權資訊,可使用 p4d -V 或 p4 info。
p4d -V
 Perforce - The Fast Software Configuration Management System.
 Copyright 1995-2007 Perforce Software.  All rights reserved.
 Rev. P4D/FREEBSD60X86/2007.2/136993 (2007/10/18).
 License: none                 //沒有授權檔

查看目前 perforce client 資訊。
p4 info
 User name: weithenn
 Client name: perforce-user
 Client host: perforce-user.weithenn.org
 Client unknown.
 Current directory: /home/perforce/logs
 Client address: 192.168.3.2:52830
 Server address: perforce-test:2666
 Server root: /home/perforce/root
 Server date: 2007/12/12 14:21:42 +0800 CST
 Server version: P4D/FREEBSD60X86/2007.2/136993 (2007/10/18)
 Server license: none         //沒有授權檔

如果你發現找不到 perforce server 的話你可手動打指令了解 perforce 相關資訊,在 FreeBSD 下你可以把下列內容寫入 ~/.cshrc 內,hostname 也可用 ip 取代。
 setenv P4PORT perforce-test:2666     //指定 perforce server 及 port
在 windows xp 命令提示字元下則可。
 c:\> p4 set P4PORT=perforce-test:2666
設定完成後可打 p4 set 來看設定好的訊息。
p4 set
 P4PORT=perforce-test:2666





步驟 4. 建立 perforce super user 帳號密碼

我們先設定 perforce super user (root) 帳號及密碼。
p4 login
 'login' not necessary, no password set for this user.    //因為 super user 還沒設定密碼

設定 perforce super user (root) 的密碼,密碼設定完成後可以發現會產生 .p4tickets 而該檔的內容就是帳號相關資訊。
p4 passwd
 Enter new password:        //輸入 super user 密碼
 Re-enter new password:     //再輸入密碼來確認
 Password updated.               

再執行 perforce login 來登入 perforce。
p4 login
 Enter password:
 User root logged in.

執行 tickets 來查看目前帳號的資訊。
p4 tickets
 perforce-test:2666 (root) 7325D1C1326E264A01948F36949A910D





步驟 5. 建立 perforce 一般使用者帳號及密碼

p4 user -f weithenn    //建立使用者帳號 weithenn 可設定內容如下
 #A Perforce User Specification.
 #
 #  User:        The user's user name.
 #  Email:       The user's email address; for email review.
 #  Update:      The date this specification was last modified.
 #  Access:      The date this user was last active.  Read only.
 #  FullName:    The user's real name.
 #  JobView:     Selects jobs for inclusion during changelist creation.
 #  Password:    If set, user must have matching $P4PASSWD on client.
 #  Reviews:     Listing of depot files to be reviewed by user.
 User:   weithenn
 Email:  weithenn@weithenn.org
 FullName:       weithenn

設定使用者帳號 weithenn 用來登入 perforce server 的密碼。
p4 passwd weithenn
 Enter new password:
 Re-enter new password:
 Password updated.

查看使用者帳號清單。
p4 users
 root <root@perforce-test> (root) accessed 2007/12/05
 weithenn <weithenn@perforce-test> (weithenn) accessed 2007/12/05

嘗試建立第三個使用者帳號可以發現是失敗的並顯示資訊跟您說需要購買授權,因為測試用授權僅能有 2 個使用者帳號及 5 個 client workspaces
p4 user -f user3     //要建立第 3 個 user account 可發現是失敗的
 Can't create a new user - over license quota.
 Try deleting old users with 'user -d'.
 License count: 2 users used of 2 licensed.
 Additional users/clients may be obtained for
 evaluation purposes by visiting...
 http://www.perforce.com/eval 





步驟 6. 建立檔案庫 (Repository)

接下來我們就可以來建立 perforce 的檔案庫 (Repository),在 perforce 存放版本控制檔案的檔案庫 (Repository) 叫 Depot,記得必須使用 super user (root) 執行 login 到 perforce 後才可動作哦。
p4 depot Test-Depot       //建立名叫 Test-Depot 的 depot 內容如下
 Depot: Test-Depot
 Owner: root
 Date: 2007/12/07 17:14:16
 Description:
Created by root.
 Type: local
 Address: local
 Suffix: .p4s
 Map: Test-Depot/...
 Depot Test-Depot saved.

查看目前 perforce server 內 depot 清單。
p4 depots          
 Depot Test-Depot 2007/12/07 local Test-Depot/... 'Created by root. '  //可看到 depot 建起來了
 Depot depot 2007/12/05 local depot/... 'Default depot'                //預設 depot

刪除預設的 depot。
p4 depot -d depot    //刪除預設的 depot
 Depot depot deleted.

再查看 perforce server 內 depot 清單確定刪除預設的 depot 了。
p4 depots
 Depot Test-Depot 2007/12/07 local Test-Depot/... 'Created by root. '

新增 Depot 完成後,若是 Windows Client 就可安裝 P4WIN 來連到 perforce server 並將專案匯入 (Import) 到 Depot 內,當您匯入 Depot 後才會發現在 P4ROOT 裡有建立您匯入的專案資料夾,匯入專案後就可分群組及設權限 (讓哪些使用者能讀、寫...等).詳細相關設定可參考 官網的 document。






4、備份及還原 Depot

建立任何服務後第一步當然就是想如何備份及還原了,詳細內容可參考 Perforce 2007.3 System Administrator's Guide Chapter 2 Supporting Perforce:Backup and Recovery 以下是大概說明一下備份及還原。

備份 Perforce 說明

Perforce 版本控制系統主要存放二種資料 versioned files 及 metadata
  • Versioned files (Depot):存放目錄樹及使用者 submit 的檔案。
  • Database files store metadata (db.*):存放 changelists、opened files、client specs、branch specs、other data concerning the history and present state of the versioned files。

Checkpoint 及 Journal files 說明,執行 checkpoint 會產生二個檔一個是 database 快照檔(checkpoint.*)及 journal 檔(journal.*)要注意的是二個檔案的數字差 1,也就是說 checkpoint.1 要跟 journal.0 才是匹配的。
  • Checkpoint:對資料庫進行複製或快照(snapshot)的動作稱之,在執行時會將 db lock。
  • Journal files:存放最後一次快照(snapshot)資料庫更新的記錄。

所以備份 Perforce 系統要備份二個東西 (checkpoint、Depot),因為 checkpoint 是保存 db.* 及相關更新資料,而 Depot 才是實體的版本控制檔案及目錄樹。

還原 Perforce 說明

在官網的說明上有舉例狀況不過下列步驟為 db 跟 depot 都死了的狀況,還原方式步驟如下:
  1. 停止 p4d 服務。
  2. 移除或搬移 $P4ROOT 目錄下 db.*。
  3. p4d -r $P4ROOT -jr checkpoint_file (-jr journal-restore)。
  4. 複製 Depot 至您設定的 $P4ROOT 目錄下。
  5. 啟動 p4d 服務。
  6. 執行 p4 login 後執行 p4 verify -q //... (確保系統的完整性)。






5、參考







6、Me FAQ

Q1. 啟動 perforce 後沒反應?

Error Message:
執行 perforce.sh start 啟動指令沒反應,但手動執行 p4d -d 卻啟動成功?
 # /usr/local/etc/rc.d/perforce.sh start

Ans:
我的問題則是因為我沒注意看設定檔把本來預設值的 # mark 拿掉後即可使用 rc.d/perforce.sh 啟動成功。
# Uncomment this line to have the server started automatically
#
 #PERFORCE_START=yes       //預設值
 PERFORCE_START=yes        //拿掉 mark

拿掉 mark 後 /usr/local/etc/rc.d/perforce.sh start 就有反應了。
/usr/local/etc/rc.d/perforce.sh start
 p4dPerforce db files in '/home/perforce/root' will be created if missing...
 Perforce Server starting...




Q2. 還原 checkpoint 及 Depot 後啟動 perforce 沒反應?

Error Message:
將 checkpoint file 及 depot 放回 $P4ROOT 後執行復原指令看來 ok 的但執行啟動 perforce 卻沒反應?查看 p4d.log 內容如下:
tail /home/perforce/logs/p4d.log
 Perforce server error:
        Database open error on db.counters!

Ans:
所以我去查看 $P4ROOT 下發現雖然 db.* 有建立起來但權限是錯的,應該是 p4admin:p4admin 但我的還原後變成是 root:p4admin,因為我是用 root 的身份去執行還原指令。將權限改回後就啟動成功了。