P4遞交建議流程:
1. p4 sync
2. 覆蓋或者改動local檔案
3. p4 delete or 直接delete 廢棄的檔案
4. p4 add: 增加新檔案到depot
5. p4 diff -se: 查看編輯過的檔案
6. p4 diff -se | p4 -x - edit: 把所有改動過的檔案置為open for submit, 對於覆蓋的檔案 or沒有用p4 edit的檔案,需要這個命令, 才能將檔案置為open狀態, 才能方便遞交
7. p4 diff -sd: 查看刪除的檔案(未用p4 delete刪除的)
8. p4 diff -sd | p4 -x - delete: 置刪除的檔案為opened狀態, 方便遞交
9. p4 submit -d 'xxx': 遞交
P4可以差分遞交, 只要別人的遞交沒有影響到你的遞交, 任何時候都可遞交, 這一點, 和svn相同, 和git不同。
可以用p4 edit -k file將file設為opened狀態。
恢複:
p4 revert -a (file 可選): revert所有開啟的已經存在的檔案
p4 revert file: revrt 已經開啟的已經存在的檔案或者新add的檔案
p4 sync -f: 強行同步到head changelist, 如果有開啟的檔案, 需要先revert
下面是網上的資料, 通用但不實用:
環境變數:
export P4PASSWD=abcdefg
export P4CLIENT=xxx //這個可以不設
export P4USER=yyy
export P4PORT=ip:port
1. p4 client #配置本地資訊,檔案下載在哪裡在這裡面配置,Root項
2、p4 sync #從perforce 下載檔案
3、p4 login #登陸perforce
4、p4 help #顯示關於命令的協助
5、p4 -h #顯示關於p4的協助
6、 p4 labels ... #顯示和這個目錄相關的標籤
7、p4 sync @label #同步標籤label中的所有檔案
8、p4 files @label #查看標籤label所包含的檔案清單
9、p4 revert #恢複所有開啟的檔案
10、p4 revert -n ... #恢複所有開啟卻沒提交的檔案
11、p4 branch brach #建立分支
12、p4 integrate -b brach #合并分支brach中描述的檔案
13、p4 opened #查看開啟的檔案
14、p4 help commands #查看p4所有命令的協助
15、4 dirs -H . #顯示目前的目錄
16、p4 branches #顯示所有的分支
17、 p4 delete filename #從p4刪除檔案
18、p4 changelists -L ... #顯示目前的目錄下面所有檔案的修改注釋
19、p4 label label #建立標籤 label,編輯標籤
20、p4 tag -l label ... #把目前的目錄下面的所有檔案添加到標籤 label
21、p4 changes ... #目前的目錄的changelist
22、 p4 sync @10931 #sync file @changelist
23、 p4 sync ...@10929 #only sync localfile@changelist
24、p4 help revisions #查看關於檔案範圍的協助
export好變數之後,然後用1進行配置,就可以用p4 sync進行代碼下載了
如果commandbar是目錄則後面要加上/...,如果是檔案的話就不用
在虛擬機器上使用p4
一共分為如下幾步:
1. 要在 Linux 上用 P4 ,就需要虛擬機器能夠訪問外網
2. 安裝及配置 P4
3. 配置原始碼環境
下面具體介紹一下各個步驟:(我稱我們的工作機本身為“主機”)
1. 配置虛擬機器訪問外部網路。設定步驟如下
1) 共用主機網卡
本地串連 -》 屬性 -》進階 -》選擇允許其它網路通過本...,並選擇家用網路串連為 VMware Network Adapter VMnet1
2) 設定虛擬機器 IP 資訊
選擇 Traditional ….
3) 設定靜態 IP
IP 192.168.0. xxx
Subnet mask 255.255.255.0
DNS 192.168.0.1(編輯/etc/reslove.conf)
Default Gateway 192.168.0.1
2. 安裝及配置 P4
1) 下載用戶端 http://www.perforce.com/perforce/downloads/index.html 我使用的是 The Perforce Command-Line Client (P4)
2) 把用戶端放在檔案夾 /usr/local/bin 。 這樣能在任何目錄直接使用 p4 命令
3) 配置用戶端,線上協助有很多種方式,我使用設定檔方式。步驟如下
a. 在 /usr 下面建立一個檔案夾 p4config ( 可以自訂 ) ,在檔案夾裡面建立檔案 p4.configfile.
b. 用 VI 打卡 p4.configfile, 輸入如下配置
P4CLIENT= (定義你的工作空間,比如 ygxu_xms )
P4PASSWD= (你的密碼)
P4PORT=10.12.33.133:1700
P4USER= (你的使用者名稱)
儲存退出。
c. 配置環境變數。修改後需要重啟這個才生效
用 vi 開啟 /etc/profile , 末尾處加入
#
# pv4 config file path
#
if test -z "$P4CONFIG" ; then
export P4CONFIG=/usr/p4config/p4.configfile
fi
d. 測試環境配置是否成功
命令 p4 info , 如果顯示了串連資訊,則 OK ,否則會提示串連不上
3. 配置原始碼環境
使用命令 p4 client 會有如下資訊顯示
Client: 你 上面配置的工作空 間
Update: 2010/01/19 20:38:36
Access: 2010/01/21 02:57:38
Owner: 你 的用 戶 名
Host: linux
Description:
Created by ygxu.
Root: /home/hammer
Options: noallwrite noclobber nocompress unlocked nomodtime normdir
SubmitOptions: submitunchanged
LineEnd: local
View:
….
//XMS/SS7_Mainline/... //Arthur_Xms/XMS/SS7_Mainline/...
….
兩個地方需要修改:
a . Root . 這個決定你的代碼會放在什麼地方,如上,我的是 /home/hammer
b. View. 這個決定你需要取哪些代碼下來,因為一般不會把全部代碼取下來,在 Linux 上我們一般只需要 XMS 的 SS7_Mainline, 所以把其他的刪掉,修改成上面這個樣子
注意事項,一定要保證空間足夠,建議先刪掉原來的 SS7_Mainline ,使用 Shrink 工具回收空間之後再取代碼。
好了,使用 p4 sync 命令吧,就可以繼續工作了。
關於 p4 的使用命令,文檔如下:
http://www.perforce.com/perforce/technical.html
更詳細的命令格式參考 http://www.perforce.com/perforce/products/p4.html
p4用戶端下載 http://www.perforce.com/perforce/downloads/index.html
************************************************************************************************************************* 快速上手perforce
perforce是什麼。參考http://www.perforce.com
[概念]
先說說概念吧,一般來說版本控制軟體都會分client和server,server負責做一些管理代碼和文檔倉庫,控制各個使用者的許可權,記錄版本升級曆史之類的事情,client使用某種用戶端連入server來完成代碼、文檔的修改、提交等工作,perforce也不例外。在server端perforce做得很精簡,沒有太多的依賴,一個p4d搞定,配置起來也很簡單,它的主要任務就是管理一個檔案倉庫depot。在client端有user和workspace兩個概念,user顧名思義就是在server上登記的一個使用者,每個user可以擁有零個或者多個workspace,甚至也可以switch到別人的workspace上去,只要有許可權。簡單的說workspace是depot到本地的一個映射,例如這樣寫 //depot/foo/... //myspace/bar/...就把depot裡面foo目錄下面所有東西映射到本地bar目錄裡面去了,myspace是和特定的workspace相關的,在設定workspace的時候可以設定它的絕對路徑。
[串連之前的配置]
首先我們需要一個使用者,假設已存在一個使用者test,沒有密碼。
$P4CONFIG=p4conf.conf; export P4CONFIG
windows下使用
p4 set P4CONFIG=p4conf.conf
這個命令設定一個環境變數P4CONFIG,檔案名稱可以自己定義,裡面可以存放用戶端的配置。在UNIX系統中配置資訊都可以寫道環境變數裡,windows下可以都寫到註冊表裡去,不過我更傾向於在某一個目錄下面建立一個設定檔,這樣可以很方便的切換不同的workspace。然後我們就可以開始編輯這個p4conf.conf設定檔,格式很簡單都是 setting=value 形式的。
建立一個workspace目錄,在裡面建立一個p4conf.conf檔案,內容如下:
P4PORT=192.168.0.1:1666
P4USER=test
P4CLIENT=test-client
這是一個最簡單的設定檔,P4PORT指名了伺服器的ip和連接埠,ip也可以用電腦名稱代替,例如
P4PORT=p4server:1666
如果留空 P4PORT=1666 這樣代表預設串連本地的server,如同 P4PORT=127.0.0.1:1666一樣。
P4USER是使用者名稱,P4CLIENT是當前是用的workspace名字,這個名字可以任意取,僅僅是一個標識。
這時候就可以cd到這個目錄運行一下
$p4 info
看看輸出是什麼,如果顯示了如下內容
User name: test
Client name: test-client
Client host: computername
Client unknown.
Current directory: /home/test/workspace
Client address: 127.0.0.1:1508
Server address: 192.168.0.1:1666
Server root: .
Server date: 2006/07/26 00:28:12 +0800 China Standard Time
Server version: P4D/NTX86/2006.1/102189 (2006/06/27)
Server license: none
就表示成功連上伺服器了,如果出現像這樣的錯誤,那就要檢查一下P4PORT有沒有設定正確
Perforce client error:
Connect to server failed; check $P4PORT.
TCP connect to 1666 failed.
connect: 1666: WSAECONNREFUSED
到這兒,最基本的client配置已經完成,很簡單吧:-) 在設定檔裡還可以存放一些其他的設定,例如
P4EDITOR指定在編輯的時候預設使用這個vim編輯器,P4DIFF指定了比較檔案的時候使用的工具,
P4PASSWD當使用者要求輸入密碼的時候可以提供一個預設密碼,其他還有一些可以參考官方文檔 P4 User's Guide
[串連之後的配置]
之前的所有設定都是儲存在環境變數,設定檔或者註冊表裡面的,這僅僅定義了一個用戶端的行為,很大一部分事情例如追蹤使用者的修改、開啟、提交的檔案之類都是由伺服器記錄下來的,所以現在我們需要通過一些命令來配置一下伺服器那頭的使用者資訊。
$p4 user
這個命令的結果是p4使用一個預設的編輯器開啟一個臨時檔案,檔案中儲存著使用者的一些資訊,例如使用者名稱,Email,FullName之類,使用者可以自己修改其中某些設定,儲存以後它會自動認可到伺服器上更新使用者佈建。這個過程中使用的編輯器可以在環境變數或者設定檔中指定(P4EDITOR)。
$p4 client
和上面一樣,這個命令編輯一個client的設定檔。Root對應於workspace在本機上的絕對路徑,Options定義了一些client的屬性,例如unlocked值允許其他的使用者switch到你的工作空間,其他的定義可以參考官方文檔。View的配置比較重要,它定義了伺服器上面的檔案到workspace的映射。例如
//depot/... //test-client/...
左右分別代表源地址和目的地址,中間以空格隔開,它的意思是將伺服器depot裡面所有檔案對應到我的工作目錄(在這之前用Root參數指定的絕對路徑)。映射可以有多行:
//depot/src/... //test-client/local-src/...
//depot/doc/... //test-client/local-doc/...
這樣就將代碼和文檔分別映射到本地,而且不一定要和伺服器上使用相同的名字。在這之中也許會有需要排出的一些檔案或者目錄,這時只需要在映射前面加上一個減號:
-//depot/doc/file1.txt //test-client/local-doc/file1.txt
這樣就排除了一個檔案。在這個過程中要留意出現衝突,如下:
//depot/src/... //test-client/src/...
//depot/doc/... //test-client/src/...
將伺服器上兩個目錄都映射到本地同一個目錄。
上面的過程中使用了一種萬用字元“...”它遞迴的匹配這個目錄以及子目錄下面的所有檔案,另一種上面沒有使用的 “*” 匹配單個目錄下的檔案,例如 //test-client/src/*.c 匹配 src目錄下面所有以 .c 作為副檔名的檔案。
上面說了,如果把伺服器上的兩個目錄都映射到本地通一個目錄會產生衝突,後者會把前者覆蓋,但如果這樣寫:
//depot/src/... //test-client/local-src/...
+//depot/doc/... //test-client/local-src/...
就會產生不同的效果,兩個目錄裡面的檔案都會出現在local-src這個目錄中,不過如果仍然有重名的檔案則後者會把前者覆蓋。
至此,client的配置基本上完成,可以 $p4 sync 一下把伺服器上的東西抓下來看看:-)
另外,如果要刪除這個cient的話很簡單 $p4 client -d test-client 就可以了
[檔案管理]
配置了這麼半天,現在開始步入正題,檔案的管理才是我們使用perforce的核心工作。簡單的說,檔案操作可以分成三類:往depot裡面添加檔案,修改並提交檔案和刪除檔案。
在這之前最好保證workspace裡面檔案和伺服器上的最新版本同步,使用命令:
$p4 sync ...
如果需要同步到某一個版本,在後面添上 #1 數字代表版本號碼;如果需要強制同步所有檔案,可以加上 -f 參數。關於sync的具體用法可以用命令
$p4 help sync
btw: 可以試試看$p4 help help
添加檔案:
$p4 add *.txt
將目前的目錄下所有副檔名為txt的檔案添加到depot相應目錄,注意在添加檔案的時候不可以使用萬用字元 ... 因為 ... 有伺服器負責解析,這時候伺服器並不知道需要添加什麼檔案,但卻可以使用 * ,它是由shell負責解析。
另外,所有修改在submit之前都不會提交到伺服器。
修改檔案:
$p4 edit //depot/src/a.c
這個檔案執行以後在伺服器上就會記錄下當前的 client已經在編輯這個檔案,在本地只有一個動作,就是將a.c檔案的唯讀屬性去掉,這時候我們就可以隨便使用某種編輯器來編輯這個檔案了,在這之前所有檔案都是唯讀,而且不要手動去掉唯讀屬性來編輯,因為那樣伺服器跟蹤不到client的修改記錄。
刪除檔案:
$p4 delete //depot/doc/a.pdf
注意在submit之前這個檔案在伺服器上也是不會被刪除的。
撤銷修改:
$p4 revert *.txt
這會將之前所有添加的或者修改的,以txt作為副檔名的檔案全部撤銷到原先的狀態,原先添加的檔案會被刪除,修改的檔案被還原到執行p4 sync時候的版本。
最後我們可以將上面所有修改全部提交:
$p4 submit
這時候p4會調用預設的或者P4EDITOR所指定的編輯器來編輯一個設定檔,裡麵包含了提交者的資訊,對這次提交的描述以及列舉出涉及到的檔案等,一般來說把Description一項填充完儲存就可以了。然後會看到螢幕上嘩啦嘩啦的輸出一堆東西,最後顯示 Change xxxx submitted. 就表示這次提交成功了。如果出現錯誤,有可能是存在衝突或者別的情況,關於衝突的問題留著後面再說~~_~~
檔案之間的diff:
$p4 diff file
$p4 diff2 file1 file2
前者在client端進行比較,使用client端配置的工具,相對於perforce內建的diff我還是更喜歡vimdiff :-)後者在server端比較,返回兩個檔案(也可能是很多檔案)之間的比較結果。
離線工作:
線上工作的時候所有檔案的修改都由伺服器來記錄,檔案的讀寫權限設定也是和伺服器上同步的,但是一但離線就需要用另一種方法來管理workspace裡面的檔案了。
首先需要對那些等待修改的檔案手動去掉唯讀屬性,然後可以開始修改,等到和伺服器建立串連的時候需要做兩件事情:
1 找到所有修改過的檔案,open for edit
$p4 diff -se | p4 -x - edit
2 找到所有刪除的檔案, open for delete
$p4 diff -sd | p4 -x - delete
最後 submit 就可以 下面是perforce diff詳述:
概述
對一個客戶工作區中的檔案和一個版本庫中的檔案版本進行比較
文法
p4 [g-opts] diff [-dflag -f -m max -sa -sb-sd -se -sr -sl -t] [file[rev#]...]
描述
p4 diff 命令在Perforce用戶端上運行一個diff程式, 對客戶工作區中的檔案和版本庫中的版本檔案進行比較。
這個命令需要一個包含版本標識符的檔案參數。如果包含了一個版本標識符,在客戶工作區的檔案會與該指定的版本檔案進行比較。如果沒有包含版本標識符,那麼客戶工作區的檔案會與當前被編輯的版本(通常是最新的版本)進行比較。在這兩種情況中,客戶的檔案都必須被開啟編輯,或比較必須是對客戶檔案最後一個同步版本不同的版本檔案進行比較。
如果檔案名稱包括萬用字元,那麼所有開啟得匹配該模板的檔案都會被比較。如果沒有提供檔案參數,那麼所有開啟的檔案會與他們在版本庫中的相應檔案進行比較。
預設情況下,diff 程式使用的是內建在p4客戶程式中的。如果要改變diff 程式去運行一個外部程式,那麼設定P4DIFF 環境變數或註冊一個變數來指向這個新的程式。
選項
-f
強制進行比較 (如果沒有版本標識符,那麼於最新版本比較),即使客戶檔案沒有開啟進行編輯
-dflags
傳遞選項給後面的diff 程式 (閱讀下面的使用提示)
-m max
限定輸出顯示diffs(or status) 的第一個max 檔案
-sa
只顯示那些開啟的與版本庫裡版本檔案不同或不存在的檔案的名字
-sb
只顯示開啟得已解析過給整合的,但是在解析後背修改過的檔案的名字
-sd
只顯示那麼沒有開啟得沒有存在與客戶工作區中,但是在版本庫中存在的檔案的名字。
-se
只顯示沒有開啟的在客戶工作區中但是與版本庫中版本不同的檔案的名字
-sr
只顯示那些在客戶工作區中開啟的用來標識版本庫中版本的檔案的名字。
-sl file...
所有開啟的檔案與版本庫進行比較,然後顯示三種狀態 same, diff, 或 missing.中的一種
If you use the -f flag together with the-sl flag, files that are open for edit are also compared and their status islisted.
-t
比較甚至檔案類型不是文本類型的檔案的不同
g-opts 閱讀 全域選項部分
使用提示
Can File Arguments Use Revision Specifier?
YES
Can File Arguments Use Revision Range?
NO
Minimal Access Level Required
read
p4 diff 支援的diff 選項有:
選項
名字
-dn
RCS輸出格式,顯示檔案中增加的和刪除的以及相關行的內容
-dc
文本輸出格式,顯示行編號範圍和三行變更內容
-ds
總結輸出格式,只顯示總共增加,刪除或修改的行數量
-du
unifiedoutput format, showing added and deleted lines with sufficient context forcompatibility with the patch(1) utility.
-dl
ignoreline-ending (CR/LF) convention when finding diffs
-db
ignorechanges made within whitespace; this flag implies -dl.
-dw
ignorewhitespace altogether; this flag implies -dl.
l
為了傳遞超過一個的選項給diff程式,可以打包他們。例如:
p4 diff -dub file
specifies a unified diff that ignores changes in whitespace.
l
?
The header line of a unifieddiff produced with the -du option for use with patch(1) displays filenames inPerforce syntax, not local syntax.
舉例
p4 diff file#5
將客戶工作區中的“file”與版本庫中的第五版本進行比較
p4 diff @1999/05/22
將客戶工作區中所有開啟得檔案與版本庫中May 22, 1999修改的版本進行比較.
p4 diff -du file
對file 進行比較,顯示符合patch(1) utility格式的輸出.
p4 diff -sr | p4 -x - revert
恢複所有開啟得沒有修改過的檔案。
This differs from p4 revert -a ( revert allunchanged files, where resolving a file, even if no changes are made, counts asa change), in that it reverts files whose workspace content matches the depotcontent, including resolved files that happen to be identical to those in thedepot.
第一個命令顯示所有開啟得沒有修改過的檔案。The second command (running p4 -x and taking arguments, one perline, from standard input, abbreviated as "-") reverts each file inthat list.
(This is the UNIX version of this command;it uses a pipe. Most operating systems have some equivalent way of performingthese operations in series).
p4關於 -x 選項的更多資訊,閱讀 全域選項 部分
相關命令
比較兩個版本庫中的檔案版本的不同
p4 diff2
查看一個檔案的全部內容
p4print
************************************************************************************************************************************ Perforce使用中文教程: p4 diff2 Perforce 命令: p4 diff2
概述
比較版本庫中檔案的兩個版本
文法
p4 [g-opts] diff2 [-dflags -q -t -u]file1[rev] file2[rev]
p4 [g-opts] diff2 [-dflags -q -t -u] -bbranch [[fromfile[rev]] tofile[rev]]
描述
p4 diff2 命令使用Perforce 伺服器中內建的diff 程式對版本庫中的倆個檔案版本進行比較。這些版本通常是指同一個檔案的兩個不同的版本,但是他們也可以是兩個完全不同檔案的版本。如果沒有沒有提供版本給檔案參數,那麼最新的版本被用來比較。
p4 diff2 不使用由環境變數P4DIFF 定義的diff 程式。p4 diff 命令使用的diff 演算法在裝有Perforce 伺服器機器上運行,而且一直使用伺服器內建的diff 程式
你 可以在指定檔案參數的位置指定一個有(或沒有)版本標識的檔案模版;這樣可以導致Perforce 對那些匹配模版的成對檔案執行diff 命令。如果你調用使用檔案模版的p4 diff2 命令,使用引號或反斜線可以從OS 外殼中退出檔案模版,那麼確定在兩個模版中的萬用字元相匹配。
Perforce presents the diffs in UNIX diffformat, prepended with a header. 起始部分的格式如下:
==== file1 (filetype1) - file2 (filetype2)==== summary
summary 可能出現的值和意義如下:
content: 檔案版本的不同內容
types: 內容完全相同, 但是檔案類型不同
identical: 版本的內容和檔案類型都相同
如果檔案file1 或 file2 在指定的版本中不存在,那麼起始部分將顯示summary 為 <none>.
選項
-q
Quietdiff.
只顯示表頭部分,並且在檔案版本內容和類型不同時也不顯示內容
-dflags
把標準的UNIX diff 選項之一作為參數運行diff 程式。閱讀 後面的《使用提示》
-b branchname
fromfile[rev] tofile[rev]
使用一個分支的定義去比較在兩個分支程式碼裡的檔案。被比較的檔案可以被檔案模版中的 fromfile 或 tofile 裡的任意一個所限定
-t
比較甚至檔案類型不是文本類型的檔案的不同
-u
Generateunified output format, showing added and deleted lines with sufficient contextfor compatibility with the patch(1) utility. Only those files that differ areincluded. File names and dates remain in Perforce syntax.
g-opts
閱讀 全域選項 部分
使用提示
Can File Arguments Use Revision Specifier?
Yes
Can File Arguments Use Revision Range?
NO
Minimal Access Level Required
readaccess necessary for both file revisions
The diff flagssupported by p4 diff2 are:
選項
名稱
-dn
RCS 輸出格式, 顯示檔案中增加的和刪除的以及相關行的內容
-dc
文本輸出格式, 顯示行編號範圍和三行變更內容
-ds
總結輸出格式,只顯示總共增加,刪除或修改的行數量
-du
unified 輸出格式 showing added and deleted lines with sufficient context forcompatibility with the patch(1) utility.
-db
忽略在空格中做的改變
-dw
忽略連在一起的空格
為了傳遞超過一個的選項給diff 程式,可以打包他們。例如
p4 diff2 -dub file1 file2
specifies a unified diff that ignoreschanges in whitespace.
The header lineof a unified diff produced with the -du option for patch(1) use displays thediffed files in Perforce syntax, not local syntax.
當 p4 diff2 命令被用來對比較二進位檔案時, 該行
... files differ ...
會被顯示出來,如果他們沒有被識別的話。
選項 -b branch [[fromfile[rev]] tofile[rev] ] 在第一次看見是可能覺得不正確。Since the branch specification maps fromfiles to tofiles, why wouldyou specify both fromfile and tofile file patterns? You wouldn't, but thissyntax allows you to specify a fromfile file pattern and a tofile revision, ora fromfile revision and a tofile file pattern.
舉例
p4 diff2 -ds file#1 file
比較 file 檔案的第二個版本和最新版本,並顯示檔案中內容被添加,更改或刪除的資訊
p4 diff2
file@34 file@1998/12/04
Diff the revision of file that was in thedepot after changelist 34 was submitted against the revision in the depot atmidnight on December 4, 1998.
p4 diff2
//depot/rel1/... //depot/rel2/...#4
比較在版本庫 //depot/rel1 中的所有最新檔案與版本庫 //depot/rel2 第四個版本檔案
p4 diff2
//depot/rel1/* //depot/rel2/...
不允許。每個檔案的萬用字元模式必須匹配
p4 diff2
-b branch2 //depot/rel2/...#2 @50
Compare the second revision of the filesin //depot/rel2/... to the files branched from it by branch specificationbranch2 at the revision they were at in changelist 50.
相關命令
比較客戶工作區中檔案與版本庫中的版本檔案
p4 diff
查看一個檔案的全部內容
p4 print