我多年来一直在使用Perforce。我想切换到使用git作为我的个人代码,但是我见过的所有git教程都假定你是一个完整的源代码控制n00b(这使得它们非常繁琐)或者你已经习惯了svn(我不是)。
我知道p4,我也理解分布式源代码控制系统背后的想法(所以我不需要销售推销,谢谢)。我想要的是从p4命令到等效git命令的转换表,以及没有p4等效的“不能没有”命令。
由于我怀疑每个p4用户使用不同的p4子集,以下是我在p4中经常做的一些我希望能够在git中做的事情,而这些事情并不是从我的文档中看出来的。看了看:
p4 change
)p4 change
)p4 changes -s pending
)p4 opened
)或待定更改列表(p4 describe
)中所有已更改文件的列表p4 diff
和p4 describe
)p4 annotate
)p4 log
)p4 submit -c
)p4 revert
)其中很多都围绕着“变革清单”。 “changelist”是p4术语。什么是git等效术语?
听起来像分支可能是git用户使用的代替p4调用更改列表的内容。有点令人困惑,因为p4也有一个叫做分支的东西,虽然它们似乎只是模糊的相关概念。 (虽然我一直认为p4的分支概念非常奇怪但它与分支的经典RCS概念有所不同。)
无论如何......我不确定如何通过git的分支来完成我通常在p4更改列表中所做的事情。在p4中我可以这样做:
$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.
此时我有一个包含a.txt的changlist。我可以编辑说明并继续工作而无需提交更改列表。此外,如果事实证明我需要对其他一些文件进行一些更改,比如在代码的某些其他层中说错误修复,我可以在同一个客户端中执行此操作:
$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.
现在我在同一个客户端中有两个单独的更改列表。我可以同时处理这些问题,而且我不需要做任何事情来“切换”它们。在提交时,我可以单独提交:
$ p4 submit -c 12346 # this will submit the changes to z.txt
$ p4 submit -c 12345 # this will submit the changes to a.txt
我无法弄清楚如何在git中复制它。根据我的实验,git add
似乎与当前分支无关。据我所知,当我git commit
它将提交我git add
时的所有文件 - 无论我当时在哪个分支:
$ git init
Initialized empty Git repository in /home/laurence/git-playground/.git/
$ ls
a.txt w.txt z.txt
$ git add -A .
$ git commit
Initial commit.
3 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 a.txt
create mode 100644 w.txt
create mode 100644 z.txt
$ vi a.txt z.txt
2 files to edit
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a.txt
# modified: z.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git branch aardvark
$ git checkout aardvark
M a.txt
M z.txt
Switched to branch 'aardvark'
$ git add a.txt
$ git checkout master
M a.txt
M z.txt
Switched to branch 'master'
$ git branch zebra
$ git checkout zebra
M a.txt
M z.txt
Switched to branch 'zebra'
$ git add z.txt
$ git status
# On branch zebra
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: z.txt
#
$ git checkout aardvark
M a.txt
M z.txt
Switched to branch 'aardvark'
$ git status
# On branch aardvark
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: z.txt
在此示例中,aardvark和zebra分支似乎包含完全相同的更改集,并且基于git status
的输出,似乎在其中任何一个中执行提交将具有相同的效果。我做错了吗?
答案 0 :(得分:68)
答案 1 :(得分:1)
我没有足够的p4经验来制作实际的备忘单,但至少有一些相似之处可以依赖。 p4“changeset”是一个git“commit”。
使用git add
将对本地工作空间的更改添加到“索引”中,稍后将使用git commit
提交索引。因此,索引是您的待定更改列表,用于所有意图和目的。
您可以查看git diff
和git status
的更改,其中git diff
通常显示工作区和索引之间的更改,但git diff --cached
显示索引和存储库之间的更改(=您的待定更改列表)。
有关更深入的信息,我建议http://progit.org/book/。既然你一般都知道版本控制,你可以浏览很多版本并提取特定于git的信息......
答案 2 :(得分:1)
由于缺乏“改变列表”概念,我和你一样受苦,这与git branches完全不同。
我会编写一个小脚本,用于创建一个包含该更改列表中文件列表的更改列表文件。
通过简单地调用git commit -a @ change_list_contents.txt然后“git commit”
来提交某个更改列表的另一个命令希望有所帮助, 利亚
答案 3 :(得分:1)
git中有一个更轻量级的替代方案可以构成您工作流程的一部分;使用git临时区域。
我经常只做更改然后提交几次提交(例如添加调试语句,重构,实际修复错误)。而不是设置您的perforce更改列表,然后进行更改,然后提交,您可以只进行更改,然后选择如何提交它们(可选择使用git暂存区域)。
您可以使用以下命令从命令行提交特定文件:
git commit a.txt
git commit z.txt
或者先显式暂存文件:
git add a.txt
git commit
git add z.txt
git commit
git gui将允许您从文件中选择行或数据块以在暂存区域中构建提交。如果您希望在不同的提交中对一个文件进行更改,这将非常有用。从git转到perforce,这是我真正想念的一件事。
这个工作流程需要牢记一点。如果您对文件进行更改A和B,请测试该文件,然后提交A,然后您没有测试该提交(独立于B)。
答案 4 :(得分:0)
这并没有具体回答您的问题,但我不知道您是否知道可以从perforce website免费下载和使用2个用户,5个Workspace版本的perforce。
这样,如果您愿意,可以在家中使用perforce进行个人项目。令人烦恼的是5个工作空间,这可能有点限制,但让家庭使用perforce非常不可思议。
答案 5 :(得分:0)
已经相当广泛地使用了Perforce和git,所以只有一种方法可以使git接近Perforce变更列表。
首先要了解的是,要正确地在git中实现此功能,而应采用的方式不是完整的语言,例如试图将它拔尖成分支,将需要进行以下更改:git将需要单个分支的多个临时区域。
Perforce变更列表允许工作流程完全没有git版本。考虑以下工作流程:
Check out a branch
Modify file A and add it to changelist 1
Modify file B and add it to changelist 2
如果您尝试使用git中的分支来完成此操作,则将得到两个分支,其中一个分支对文件A
进行了更改,另一个分支对文件B
进行了更改,但是没有地方可以同时看到两个文件A
和B
的更改。
我可以看到的最接近的近似值是使用git add . -p
,然后使用'a'
和'd'
子命令来选择或拒绝整个文件。但是,这并不完全相同,这里的差异源于两个系统在总体操作方式上的根本差异。
Git(和subversion,对于本次讨论无关紧要)允许更改文件而无需事先告知任何人。您只需更改文件,然后在提交更改时让git将其全部整理出来。 Perforce要求您在允许更改之前主动检出文件,因此,更改列表必须存在。本质上,Perforce要求您在更改索引之前将文件添加到索引。因此,Perforce中必须有多个变更列表,还有git没有等效项的原因。 它根本不需要它们。
答案 6 :(得分:0)
在Git 2.27(2020年第二季度)中,“ git p4
”学习了四个新的钩子以及“ --no-verify
”选项绕过它们(以及现有的“ p4-pre-submit
”钩子)。
请参见commit 1ec4a0a,commit 38ecf75,commit cd1e0dc(2020年2月14日)和commit 4935c45,commit aa8b766,commit 9f59ca4,{{3} }(2020年2月11日)通过commit 6b602a2。
(由Ben Keene (seraphire
)在Junio C Hamano -- gitster
--中合并,2020年4月22日)
commit 5f2ec21:添加p4提交钩子
签名人:Ben Keene
git命令“
commit
”支持许多钩子,这些钩子支持更改commit命令的行为。
git-p4.py
程序只有一个现有的钩子“p4-pre-submit
”。此命令在过程的早期出现。
在处理流程中没有钩子可以以编程方式修改P4更改列表文本。
将3个新的钩子添加到
git-p4.py
的提交选项中。新的挂钩是:
p4-prepare-changelist
-创建更改列表文件后执行此挂钩。
即使设置了--prepare-p4-only
选项,钩子也将被执行。
该挂钩忽略了git-p4
的现有行为,而忽略了--no-verify
选项。
p4-changelist
-在用户编辑变更列表后执行此挂钩。
如果用户选择了--prepare-p4-only
选项,请不要执行此挂钩。
该钩子将遵循git commit
的约定来尊重--no-verify
。
p4-post-changelist
-在P4提交过程成功完成之后执行此挂接。
该挂钩不带任何参数,并且无论--no-verify
选项如何执行。不会检查返回值。
对新钩子的调用:
p4-prepare-changelist
,p4-changelist
和p4-post-changelist
应该全部在try-finally块内调用。
在Git 2.28(2020年第三季度)之前,“ --prepare-p4-only
”选项应该在重放一个变更集后停止,但仍会继续(错误地?)
请参见git commit
的commit 2dfdd70(2020年5月12日)。
(由Ben Keene (seraphire
)在Junio C Hamano -- gitster
--中合并,2020年6月2日)
commit 7a8fec9:通过多次提交修复
--prepare-p4-only
错误签名人:Ben Keene
在将
git p4 submit
与--prepare-p4-only
选项一起使用时,程序应准备一个p4更改列表,并通知用户有更多提交待处理,然后停止处理。
p4-changelist
挂钩功能引入了一个错误,该错误使程序继续尝试同时处理所有未决的变更列表。成功应用提交后,函数
applyCommit
返回True
,程序应继续运行。
但是,如果设置了可选标志--prepare-p4-only
,则程序应在第一个应用程序之后停止。在成功完成
--prepare-p4-only
方法之后,更改P4Submit的run方法的逻辑以检查标志applyCommit
。如果有1个以上的提交正在提交到P4,则该方法将正确准备P4变更列表,但是仍然会以退出代码1退出应用程序。
git-p4.py
没有定义在这种情况下的退出代码。