?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
git-p4 - 從 Perforce 存儲庫導入和提交
git p4 clone [<sync options>] [<clone options>] <p4 depot path>… git p4 sync [<sync options>] [<p4 depot path>…]git p4 rebase git p4 submit [<submit options>] [<master branch name>]
該命令提供了一種使用 Git 與 p4 存儲庫交互的方式。
使用現(xiàn)有的 p4 存儲庫創(chuàng)建一個新的 Git 存儲庫git p4 clone
,并為其提供一個或多個 p4 depot 路徑。將 p4 更改中的新提交合并到git p4 sync
。該sync
命令還用于包含來自其他 p4 軟件倉庫路徑的新分支。使用提交 Git 回到 p4 git p4 submit
。該命令git p4 rebase
執(zhí)行 sync 并將當前分支重新綁定到更新的 p4 遠程分支上。
克隆存儲庫:$ git p4 clone // depot / path / project
在新創(chuàng)建的 Git 倉庫中做一些工作:$ cd project $ vi foo.h $ git commit -a -m“edited foo.h”
使用 p4 的最近更改更新 Git 存儲庫,重新定位頂層的工作:$ git p4 rebase
提交你的提交到 p4:$ git p4 submit
通常git p4 clone
用于從現(xiàn)有的 p4 存儲庫創(chuàng)建新的 Git 目錄:
$ git p4 clone //depot/path/project
這個:
在名為的子目錄中創(chuàng)建一個空的 Git 存儲庫project
。
將來自給定 p4 倉庫路徑的頭部修訂版的完整內(nèi)容導入到 Git 分支中的單個提交中refs/remotes/p4/master
。
master
從這個遠程創(chuàng)建一個本地分支并將其檢出。
要在 Git 中重現(xiàn)整個 p4 歷史記錄,請@all
在軟件倉庫路徑中使用修飾符:
$ git p4 clone //depot/path/project@all
隨著 p4 存儲庫中的開發(fā)繼續(xù),可以使用以下方法將這些更改包含在 Git 存儲庫中:
$ git p4 sync
該命令在 p4 中查找新的更改,并將它們作為 Git 提交導入。
P4 存儲庫也可以使用以下方式添加到現(xiàn)有的 Git 存儲庫git p4 sync
:
$ mkdir repo-git $ cd repo-git $ git init $ git p4 sync //path/in/your/perforce/depot
這會將指定的軟件倉庫導入到refs/remotes/p4/master
現(xiàn)有的 Git 倉庫中。該--branch
選項可用于指定用于 p4 內(nèi)容的不同分支。
如果一個 Git 倉庫包含分支refs/remotes/origin/p4
,那么它們將在第一次被提取和咨詢git p4 sync
。由于從 p4 直接導入比從 Git 遠程獲取更改要慢得多,所以這在多開發(fā)人員環(huán)境中很有用。
如果有多個分支,git p4 sync
則會自動使用“ 分支檢測”算法嘗試將新更改劃分到正確的分支中。這可以通過--branch
指定只更新一個分支的選項來覆蓋。
一個常見的工作模式是從 p4 倉庫獲取最新的更改,并將它們與本地未提交的更改合并。通常,p4 存儲庫是所有代碼的最終位置,因此重定位工作流程是有意義的。這個命令git p4 sync
之后會git rebase
在更新的 p4 更改之前移動本地提交。
$ git p4 rebase
將來自 Git 存儲庫的更改提交回 p4 存儲庫需要單獨的 p4 客戶端工作區(qū)。這應該使用P4CLIENT
環(huán)境變量或 Git 配置變量來指定git-p4.client
。p4 客戶端必須存在,但如果客戶端根目錄尚不存在,它將被創(chuàng)建并填充。
要提交當前 Git 分支但不在分支中的所有更改p4/master
,請使用:
$ git p4 submit
要指定除當前分支以外的分支,請使用:
$ git p4 submit topicbranch
上游引用通常是refs/remotes/p4/master
,但可以使用--origin=
命令行選項覆蓋。
p4 的更改將在用戶調(diào)用時創(chuàng)建git p4 submit
。該--preserve-user
選項將根據(jù) Git 提交的作者來修改所有權。此選項需要 p4 中的管理員權限,可以使用該權限授予p4 protect
。
除克隆以外的所有命令均接受這些選項
--git-dir <dir>
設置GIT_DIR
環(huán)境變量。見 git [1] 。
-v --verbose
提供更多進度信息。
這些選項可以在初始clone
和后續(xù)sync
操作中使用。
--branch <ref>
將更改導入 <ref> 而不是 refs / remotes / p4 / master 。如果 <ref> 以 refs /開頭,則按原樣使用。否則,如果它不以 p4 /開頭,則添加該前綴。
默認情況下,不以 refs /開始的 <ref> 被視為遠程跟蹤分支的名稱(在 refs / remotes / 下)。這種行為可以使用 --import-local 選項來修改。
默認的 <ref> 是“master”。
本示例將新的遠程 “p4 / proj2” 導入到現(xiàn)有的 Git 存儲庫中:
$ git init $ git p4 sync --branch=refs/remotes/p4/proj2 //depot/proj2
--detect-branches
使用分支檢測算法在 p4 中查找新路徑。它在“分支檢測”中記錄如下。
--changesfile <file>
準確導入列出的 p4 更改編號file
,每行一個。通常,git p4
檢查當前 p4 存儲庫狀態(tài)并檢測它應導入的更改。
--silent
不要打印任何進度信息。
--detect-labels
查詢與倉庫路徑關聯(lián)的標簽的 p4 ,并將它們作為標簽添加到 Git 中。由于只有與新的更改列表相關的導入標簽才有用。已過時。
--import-labels
將標簽從 p4 導入到 Git 中。
--import-local
默認情況下,p4 分支存儲在refs/remotes/p4/
其中,它們將被 git-branch [1] 和其他命令視為遠程跟蹤分支。這個選項代替了 p4 分支refs/heads/p4/
。請注意,未來的同步操作也必須指定--import-local
,以便他們可以在 refs / heads 中找到 p4 分支。
--max-changes <n>
導入大多數(shù)n
變化,而不是包含在給定修訂說明符中的整個變化范圍。一個典型的用法將被@all
用作修訂說明符,然后用于--max-changes 1000
僅導入最后的1000個修訂版本而不是整個修訂歷史記錄。
--changes-block-size <n>
將修訂說明符(例如,@all
轉(zhuǎn)換為特定更改編號列表)時使用的內(nèi)部塊大小。不是使用單個調(diào)用來p4 changes
查找轉(zhuǎn)換的完整更改列表,而是調(diào)用一系列調(diào)用p4 changes -m
,其中每個調(diào)用都請求一個給定大小的更改塊。默認塊大小為500,通常應該是合適的。
--keep-path
缺省情況下,文件名從 p4 軟件倉庫路徑到 Git 的映射涉及刪除整個軟件倉庫路徑。使用此選項,完整的 p4 倉庫路徑將保留在 Git 中。例如,//depot/main/foo/bar.c
從中導入的路徑//depot/main/
變?yōu)?code>foo/bar.c。與此同時--keep-path
,Git 路徑是depot/main/foo/bar.c
。
--use-client-spec
使用客戶端規(guī)格在 p4 中查找感興趣的文件列表。請參閱下面的“客戶端規(guī)格”部分。
-/ <path>
克隆或同步時排除選定的軟件倉庫路徑。
這些選項可以在初始階段clone
與上述sync
選項一起使用。
--destination <directory>
在哪里創(chuàng)建 Git 存儲庫。如果未提供,則使用 p4 depot 路徑中的最后一個組件創(chuàng)建新目錄。
--bare
執(zhí)行克隆空項。參見 git-clone [1] 。
這些選項可以用來修改git p4 submit
行為。
--origin <commit>
確認提交到 p4 的上游位置。默認情況下,這是可從中獲得的最新 p4 提交HEAD
。
-M
檢測重命名。參見 git-diff [1] 。重命名將使用顯式move
操作在 p4 中表示。沒有對應的選項來檢測副本,但移動和副本都有變量。
--preserve-user
在提交給 p4 之前,重新創(chuàng)建 p4 更改。該選項需要 p4 管理員權限。
--export-labels
從 Git 導出標簽作為 p4 標簽。在 Git 中找到的標簽應用于 perforce 工作目錄。
-n --dry-run
顯示將提交給 p4 的提交; 不要在 Git 或 p4 中更改狀態(tài)。
--prepare-p4-only
將提交應用于 p4 工作區(qū),在 p4 中打開,添加和刪除文件,就像正常的提交操作一樣。不要發(fā)布最終的“ p4 提交”,而是要打印一條關于如何手動提交或回復的消息。該選項總是在第一個(最早的)提交之后停止。Git 標簽不會導出到 p4 。
--shelve
而不是提交創(chuàng)建一系列擱置的更改表。創(chuàng)建每個擱置后,相關文件將被還原/刪除。如果您有多個提交,則會創(chuàng)建多個擱板。
--update-shelve CHANGELIST
使用此提交更新現(xiàn)有的擱置更改列表。意味著 --shelve。
--conflict=(ask|skip|quit)
將提交應用于 p4 時可能會發(fā)生沖突。發(fā)生這種情況時,默認行為(“詢問”)是提示是否跳過此提交并繼續(xù)或退出。此選項可用于繞過提示,導致提交沖突自動跳過,或退出嘗試提交而不提示。
--branch <branch>
提交后,同步該命名分支,而不是默認的 p4 / master 。有關更多信息,請參閱上面的“同步選項”一節(jié)。
這些選項可以用來修改git p4 rebase
行為。
--import-labels
導入 p4 標簽。
p4 的貯庫路徑參數(shù)git p4 sync
和git p4 clone
可以是一個或多個空格分隔 P4 貯庫的路徑,與在端部的可選 P4 修訂說明符:
"//depot/my/project"
#head
在樹下的更改中導入一個具有所有文件的提交。
"//depot/my/project@all"
為該軟件倉庫路徑的歷史記錄中的每個更改導入一個提交。
"//depot/my/project@1,6"
只導入更改1到6。
"//depot/proj1@all //depot/proj2@all"
將來自兩個指定軟件倉庫路徑的所有更改導入單個存儲庫。只包含這些目錄下的文件。每個 “proj1” 和 “proj2” 在 Git 中都沒有一個子目錄。--destination
指定多個軟件倉庫路徑時必須使用該選項。修訂說明符必須在每個軟件倉庫路徑上指定相同。如果軟件倉庫路徑中有相同名稱的文件,則具有該文件最近更新版本的路徑就是出現(xiàn)在 Git 中的路徑。
請參閱p4 help revisions
p4 修訂說明符的完整語法。
p4 客戶端規(guī)范是使用該p4 client
命令維護的,并在其他字段中包含一個視圖,指定倉庫如何映射到客戶端存儲庫。在clone
與sync
給定的命令時,可以咨詢客戶規(guī)范--use-client-spec
選項,或當 useClientSpec 變量為真。之后git p4 clone
,useClientSpec 變量將在存儲庫配置文件中自動設置。這允許未來的git p4 submit
命令正常工作; 提交命令僅查看變量并且沒有命令行選項。
有關 p4 視圖的完整語法記錄在中p4 help views
。git p4
只知道視圖語法的一個子集。它理解多行映射,覆蓋+
,排除-
和空白處的雙引號??赡艿耐ㄅ浞?code>git p4只有句柄…
,并且只有在路徑的末尾。git p4
如果遇到未處理的通配符將會投訴。
存在重疊映射的實現(xiàn)中的錯誤。如果多個軟件倉庫路徑通過疊加層映射到存儲庫中的相同位置,則git p4
可以選擇錯誤的路徑。如果沒有專門的客戶端規(guī)范,這很難解決git p4
。
客戶的名字可以以git p4
多種方式給出。git-p4.client
如果該變量存在,則該變量優(yōu)先。否則,將使用確定客戶端的普通 p4 機制:環(huán)境變量 P4CLIENT ,由 P4CONFIG 引用的文件或本地主機名。
P4 與 Git 沒有相同的分支概念。相反,p4將其內(nèi)容組織為目錄樹,根據(jù)約定,不同的邏輯分支位于樹中的不同位置。該p4 branch
命令用于維護樹中不同區(qū)域之間的映射,并指示相關內(nèi)容。git p4
可以使用這些映射來確定分支關系。
如果您有一個存儲庫,其中所有感興趣的分支都作為單個軟件倉庫路徑的子目錄存在,則可以--detect-branches
在克隆或同步時使用git p4
自動在 p4 中查找子目錄,并在 Git 中將其作為分支生成。
例如,如果 P4 存儲庫結(jié)構(gòu)是:
//depot/main/...//depot/branch1/...
并且“p4 分支 - o 分支1”顯示一個 View 行,如下所示:
//depot/main/... //depot/branch1/...
然后這個git p4 clone
命令:
git p4 clone --detect-branches //depot@all
refs/remotes/p4/
為// depot / main 生成一個單獨的分支master
,并調(diào)用一個/ depot / branch1 depot/branch1
。
但是,沒有必要在 p4 中創(chuàng)建分支以便像分支一樣使用它們。由于很難自動推斷分支關系,git-p4.branchList
因此可以使用 Git 配置設置來明確標識分支關系。它是一個 “source :destination” 對的列表,就像一個簡單的 p4 分支規(guī)范,其中 “source” 和 “destination” 是 p4 存儲庫中的路徑元素。上面的例子依賴于 p4 分支的存在。沒有 p4 分支,相同的結(jié)果將會發(fā)生:
git init depot cd depot git config git-p4.branchList main:branch1 git p4 clone --detect-branches //depot@all .
快速導入機制git p4
為每次調(diào)用創(chuàng)建一個包文件git p4 sync
。通常,Git 垃圾壓縮( git-gc [1] )會自動將這些壓縮到更少的包文件,但顯式調(diào)用git repack -adf
可能會提高性能。
以下配置設置可用于修改git p4
行為。他們都在該git-p4
部分。
git-p4.user
用戶指定為所有p4命令的選項,并帶有-u <user>
。該環(huán)境變量P4USER
可以用來代替。
git-p4.password
作為所有 p4 命令的選項指定的密碼-P <password>
。該環(huán)境變量P4PASS
可以用來代替。
git-p4.port
端口被指定為所有 p4 命令的選項-p <port>
。該環(huán)境變量P4PORT
可以用來代替。
git-p4.host
主機被指定為所有 p4 命令的選項,其中包含-h <host>
。該環(huán)境變量P4HOST
可以用來代替。
git-p4.client
客戶端指定為所有 p4 命令的選項-c <client>
,包括客戶端規(guī)范。
git-p4.retries
指定在p4 sync
網(wǎng)絡超時的情況下重試 p4 命令(特別是)的次數(shù)。默認值為3.將該值設置為0以禁用重試,或者如果您的 p4版本不支持重試(2012年之前)。
git-p4.syncFromOrigin
因為從其他 Git 存儲庫導入提交比從 p4 導入提交要快得多,因此存在一種機制來首先在 Git 遠程中查找 p4 更改。如果存在分支refs/remote/origin/p4
,那么當從 p4 同步時,這些分支將被提取和使用??梢詫⒋俗兞吭O置false
為禁用此行為。
git-p4.branchUser
分支檢測的一個階段涉及查看 p4 分支以找到要導入的新分支。默認情況下,檢查所有分支。此選項將搜索限制為僅由變量中指定的單個用戶擁有的搜索。
git-p4.branchList
分支檢測啟用時要導入的分支列表。每個條目應該是一對由冒號(:)分隔的分支名稱。這個例子聲明 branchA 和 branchB 都是從 main 創(chuàng)建的:
git config git-p4.branchList main:branchA git config --add git-p4.branchList main:branchB
git-p4.ignoredP4Labels
要忽略的 p4 標簽列表。這是在發(fā)現(xiàn)不可引用的標簽時自動構(gòu)建的。
git-p4.importLabels
根據(jù) --import-labels 將 p4 標簽導入到 git 中。
git-p4.labelImportRegexp
只有與此正則表達式匹配的 p4 標簽才會被導入。默認值是[a-zA-Z0-9_\-.]+$
。
git-p4.useClientSpec
指定應該使用 p4 客戶端規(guī)范來識別感興趣的 p4 倉庫路徑。這相當于指定選項--use-client-spec
。請參閱上面的“客戶端規(guī)格”部分。這個變量是一個布爾值,而不是 p4 客戶端的名字。
git-p4.pathEncoding
Perforce 保留原始操作系統(tǒng)給定的路徑編碼。Git 預計編碼為 UTF-8 的路徑。使用此配置來告訴 git-p4 Perforce 用于路徑的編碼。此編碼用于將路徑轉(zhuǎn)碼為 UTF-8 。例如,Windows 上的 Perforce 通常使用 “cp1252” 來編碼路徑名稱。
git-p4.largeFileSystem
指定用于大型(二進制)文件的系統(tǒng)。請注意,大文件系統(tǒng)不支持該git p4 submit
命令。只有 Git LFS 現(xiàn)在被實現(xiàn)(請參閱https://git-lfs.github.com/了解更多信息)。下載并安裝 Git LFS 命令行擴展以使用此選項并像這樣配置它:
git config git-p4.largeFileSystem GitLFS
git-p4.largeFileExtensions
所有與列表中文件擴展名匹配的文件都將由大文件系統(tǒng)處理。不要以擴展名為前綴.
。
git-p4.largeFileThreshold
所有未壓縮大小超過閾值的文件都將由大文件系統(tǒng)處理。默認情況下,閾值以字節(jié)為單位定義。添加后綴 k ,m 或 g 以更改單位。
git-p4.largeFileCompressedThreshold
壓縮大小超過閾值的所有文件都將由大文件系統(tǒng)處理。此選項可能會減慢您的克隆/同步過程。默認情況下,閾值以字節(jié)為單位定義。添加后綴 k ,m 或 g 以更改單位。
git-p4.largeFilePush
定義大文件是否自動推送到服務器的布爾變量。
git-p4.keepEmptyCommits
如果此布爾選項設置為 true ,則僅包含排除文件的更改列表將作為空提交導入。
git-p4.mapUser
將 P4 用戶映射到 Git 中的名稱和電子郵件地址。使用以下格式的字符串來創(chuàng)建映射:
git config --add git-p4.mapUser "p4user = First Last <mail@address.com>"
映射將覆蓋來自 P4 的任何用戶信息??梢远x多個 P4 用戶的映射。
git-p4.detectRenames
檢測重命名。參見 git-diff [1] 。這可能是真實的,錯誤的,或者如預期的那樣git diff -M
。
git-p4.detectCopies
檢測副本。參見 git-diff [1] 。這可能是真實的,錯誤的,或者如預期的那樣git diff -C
。
git-p4.detectCopiesHarder
更難檢測副本。參見 git-diff [1] 。一個布爾值。
git-p4.preserveUser
在提交時,無論誰調(diào)用,都要重新編寫更改以反映 Git 作者git p4 submit
。
git-p4.allowMissingP4Users
如果preserveUser
屬實,git p4
通常會在 p4 用戶映射中找不到作者的情況下死亡。無論如何,此設置都會提交更改。
git-p4.skipSubmitEdit
提交過程在提交每個 p4 更改之前調(diào)用編輯器。但是,如果此設置為 true ,則跳過編輯步驟。
git-p4.skipSubmitEditCheck
編輯 p4 更改消息后,git p4
通過查看文件修改時間確保描述確實發(fā)生了變化。該選項禁用該測試。
git-p4.allowSubmit
默認情況下,任何分支都可以用作git p4 submit
操作的源。這個配置變量(如果設置的話)只允許指定的分支用作提交源。分支名稱必須是短名稱(不包括 “refs / heads /” ),并且應該用逗號(“,”)分隔,而不能有空格。
git-p4.skipUserNameCheck
如果git p4 submit
在 p4 用戶映射中不存在正在運行的用戶,則git p4
退出。無論如何,此選項都可用于強制提交。
git-p4.attemptRCSCleanup
如果啟用,git p4 submit
將嘗試清理 RCS 關鍵字($ Header $等)。否則這些會導致合并沖突并阻止提交進行。目前這個選項應該被認為是實驗性的。
git-p4.exportLabels
根據(jù) --export-labels 將 Git 標簽導出到 p4 標簽。
git-p4.labelExportRegexp
只有與此正則表達式匹配的 p4 標簽才會被導出。默認值是[a-zA-Z0-9_\-.]+$
。
git-p4.conflict
根據(jù) --conflict 發(fā)現(xiàn)與 p4 發(fā)生沖突時的指定提交行為。默認行為是ask
。
使用 Git 快速導入來導入 p4 中的更改集。
克隆或同步不需要 p4 客戶端; 文件內(nèi)容使用收集p4 print
。
提交需要一個與 Git 存儲庫不在同一位置的 p4 客戶端。修補程序一次一個地應用于此 p4 客戶端并從那里提交。
導入的每個提交git p4
在日志消息末尾都有一行指示 p4 倉庫位置和更改編號。此行被以后的git p4 sync
操作用于了解哪些 p4 更改是新的。