在初始克隆后扩展`git-p4`clientspec

在初始克隆后扩展`git-p4`clientspec,git,perforce,git-p4,Git,Perforce,Git P4,在执行了git-p4克隆--use clientspec之后,我想向clientspec添加一个额外的条目,并将添加条目的当前状态导入我的git存储库 扩展clientspec后,git-p4 rebase什么都不做(可能是因为自上次提交更改以来没有新的相关更改列表,我所做的只是更新clientspec) 我尝试了执行git-p4同步--use client spec,但这抱怨说快速导入失败,因为新提示不包含我的初始提交 有没有一种方法可以扩展客户机规范,而不必从头克隆新的git存储库?在撰写本

在执行了git-p4克隆--use clientspec之后,我想向clientspec添加一个额外的条目,并将添加条目的当前状态导入我的git存储库

扩展clientspec后,
git-p4 rebase
什么都不做(可能是因为自上次提交更改以来没有新的相关更改列表,我所做的只是更新clientspec)

我尝试了执行git-p4同步--use client spec,但这抱怨说快速导入失败,因为新提示不包含我的初始提交


有没有一种方法可以扩展客户机规范,而不必从头克隆新的git存储库?

在撰写本文时,我找不到一种方法可以让git-p4直接从Performce clientspec导入其他路径。然而,我相信我已经设计了一种手动操作的方法,并让git-p4遵守它

免责声明:对于以下步骤可能造成的任何损坏,我概不负责。首先备份
.git
树可能是个好主意

想法 正如您所说,只需向Perforce clientspec添加一条路径并执行
git p4 rebase
一开始什么都不做。但是,我注意到,
git-p4 rebase
在Perforce中修改文件后,如果新路径在
git-p4
depot paths
列表中,将从该路径添加文件。(
depot paths
是提供给
git p4 clone
的depot paths的初始列表),因此您需要:

  • 将新路径的初始副本获取到Git存储库中
  • 诱使git-p4相信它添加了初始副本本身
  • 获取
    git-p4
    以将新路径包括在其
    仓库路径
    列表中
  • 因此,您可以同步来自Perforce的文件副本,确保它们与已经从Perforce导入的文件一致,然后您可以显式地将它们添加到Git存储库中

    git-p4
    显然不会将其
    仓库路径
    列表或上次导入的性能更改编号存储在git提交消息以外的任何位置,因此您可以通过在自己的提交消息中复制其元数据来欺骗
    git-p4

    最后,您可以移动
    p4/master
    (和
    p4/HEAD
    ,它是
    p4/master
    的别名)以指向您的新提交,以便将来的
    git p4 rebase
    命令将该提交视为从performe导入的内容

    一步一步地
  • 查看与
    p4/master
    对应的提交。确保没有任何阶段性或未阶段性更改。如果你这样做,就把它们藏起来

  • 将新路径添加到git-p4使用的Performce客户端规范中。在下面的步骤中,我将其称为
    //depot/new/path/

  • 运行
    git log
    查看上次导入的performe更改中的提交消息。它将有一行如下所示:

    [git-p4:depot paths=“//depot/tree/”:change=12345]

    记下性能更改编号

  • 在Performce客户端中,将添加的路径同步到该更改编号。例如:
    p4 sync//depot/new/path/…@12345

  • 递归地将这些新同步的文件从Perforce客户端复制到Git存储库中的相应位置。(如果存在符号链接,此处可能需要特别小心。)

  • 在git存储库中的新路径上运行
    git add

  • 运行
    git提交
    。您通常可以在提交消息中说任何您想说的话(例如,“初始导入//depot/new/path/from CLN 12345”)。但是,在消息末尾,您必须复制以前观察到的
    git-p4
    元数据行:

    [git-p4:depot paths=“//depot/tree/”:change=12345]

    如果
    //depot/new/path/
    不是
    //depot/tree
    的子目录,则必须修改
    depot路径
    以添加新路径:

    [git-p4:depot path=“//depot/new/path/,//depot/tree/”:change=12345]

    仓库路径
    列表必须按ASCII值排序(即
    //depot/foo-bar/
    应位于
    //depot/foo/bar/
    之前)

  • 再次运行git日志。确认提交消息中的
    git-p4
    行看起来像导入的Perforce更改中的行。记下提交的SHA1散列

  • 导航到Git存储库的根目录。编辑
    .git/refs/remotes/p4/master
    。删除列出的旧SHA1散列,并将其替换为提交的SHA1散列。(如果
    .git/refs/remotes/p4/master
    不存在,请选中
    .git/packed refs
    并更新相应的行。)

  • 现在,您的Git存储库包含来自Change12345的
    //depot/new/path/
    文件的副本,它应该从将来的Performce更改中获取对这些文件的任何更改

    还有一些值得注意的事情
    • 显然,只有在您提交导入这些文件之后,新路径才会存在于您的Git存储库中,因此
      Git bisect
      如果跨越该边界并涉及这些文件,那么它将不会有用

    • 由于如果修改后的文件包含在Performce clientspec中(并且包含在
      git-p4
      仓库路径中),则会自动添加这些文件,因此在某些情况下,您可能会避免所有这些工作。例如,如果您事先知道有人将要向Perforce depot添加一个新目录,并且该目录已包含在您的
      depot路径中,但不包含在您的clientspec中,则您可以先将其添加到Perforce clientspec中。然后,您应该能够在新路径完成后自动获取该路径