适用于Perforce用户的Git

时间:2010-09-07 06:52:23

标签: git perforce

我多年来一直在使用Perforce。我想切换到使用git作为我的个人代码,但是我见过的所有git教程都假定你是一个完整的源代码控制n00b(这使得它们非常繁琐)或者你已经习惯了svn(我不是)。

我知道p4,我也理解分布式源代码控制系统背后的想法(所以我不需要销售推销,谢谢)。我想要的是从p4命令到等效git命令的转换表,以及没有p4等效的“不能没有”命令。

由于我怀疑每个p4用户使用不同的p4子集,以下是我在p4中经常做的一些我希望能够在git中做的事情,而这些事情并不是从我的文档中看出来的。看了看:

  1. 在单个客户端中创建多个待处理的更改列表。 (p4 change
  2. 编辑待处理的更改列表。 (还p4 change
  3. 查看我所有待处理的更改列表(p4 changes -s pending
  4. 的列表
  5. 我的客户端(p4 opened)或待定更改列表(p4 describe)中所有已更改文件的列表
  6. 查看待处理更改列表的差异(我使用包装脚本,使用p4 diffp4 describe
  7. 对于给定文件,请查看哪些提交的更改列表会影响哪些行(p4 annotate
  8. 对于给定文件,请参阅影响该文件的更改列表的说明列表(p4 log
  9. 提交待定更改列表(p4 submit -c
  10. 中止待处理的更改列表(p4 revert
  11. 其中很多都围绕着“变革清单”。 “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的输出,似乎在其中任何一个中执行提交将具有相同的效果。我做错了吗?

7 个答案:

答案 0 :(得分:68)

答案 1 :(得分:1)

我没有足够的p4经验来制作实际的备忘单,但至少有一些相似之处可以依赖。 p4“changeset”是一个git“commit”。

使用git add将对本地工作空间的更改添加到“索引”中,稍后将使用git commit提交索引。因此,索引是您的待定更改列表,用于所有意图和目的。

您可以查看git diffgit 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进行了更改,但是没有地方可以同时看到两个文件AB的更改。

我可以看到的最接近的近似值是使用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 1ec4a0acommit 38ecf75commit cd1e0dc(2020年2月14日)和commit 4935c45commit aa8b766commit 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-changelistp4-changelistp4-post-changelist应该全部在try-finally块内调用。


在Git 2.28(2020年第三季度)之前,“ --prepare-p4-only”选项应该在重放一个变更集后停止,但仍会继续(错误地?)

请参见git commitcommit 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没有定义在这种情况下的退出代码。