【问题标题】:How to clone branch with git-p4?如何使用 git-p4 克隆分支?
【发布时间】:2013-02-24 16:02:09
【问题描述】:

我做到了:

git p4 clone //depot/path/to/project/trunk/@all project

创建projectmaster 分支。现在我想将//depot/path/to/project/release 克隆到projectrelease 分支。这是怎么做到的?

更新:使用--detect-branches 也不起作用。它报告它正在更新两个分支(当实际上有三个分支时)但git branch 报告只有 master 存在。

【问题讨论】:

    标签: git-p4


    【解决方案1】:

    这是我使用 git-p4 时的设置说明。这可能会有所帮助:

    • 下载p4 linux client。将文件存储在~/bin/usr/local/binchmod +x

    • 将 git-p4 设置为 root

      chmod 755 /usr/share/doc/git/contrib/fast-import/git-p4
      ln -s /usr/share/doc/git/contrib/fast-import/git-p4 /usr/local/bin
      
    • 为 git-p4 定义 Git 全局变量

      git config --global alias.p4 '!git-p4'
      git config --global git-p4.detectRenames true
      git config --global git-p4.detectCopies true
      
    • 为直接“p4”使用设置定义

      export P4PORT=SERVER_NAME:PORT_NUMBER
      
    • 设置登录凭据

      export P4USER=USER_NAME
      export P4PASSWD=PASSWORD
      
    • 使用 P4 'client' 选择 Perforce 分支

      运行“p4 client”命令,只添加你所在的路径/分支 感兴趣。如果您想命名客户端工作空间,您可以添加一个 命令末尾的可选 CLIENT_NAME 参数。这将允许您 在同一台机器上使用不同的客户端定义。

      $ p4 client [CLIENT_NAME]
      
      View:
      //depot/main... //CLIENT_NAME/main...
      //depot/patch... //CLIENT_NAME/patch...
      //depot/dev... //CLIENT_NAME/dev...
      
    • 克隆存储库

      • 简单导入

        git p4 clone --use-client-spec --detect-branches //depot@all GIT_DIR
        
      • 高级导入

        git init PROJ; cd PROJ/
        git config git-p4.branchList main:patch
        git config --add git-p4.branchList main:dev
        git p4 clone --use-client-spec //depot@all .
        
    • 将更改提交回 Perforce

      为了向 Perforce 提交更改,它需要一个客户端工作区, 与 git 工作树分开。建议工作区开启 与 Perforce git 工作目录相同的文件系统。

      此外,对工作区路径的引用存储在 Perforce 服务器,并将在p4 submit 命令期间使用。

      第一步是创建本地客户端工作区。 CLIENT_NAME 是 一个可选参数。如果您不定义它,p4 将使用您的主机名。

      p4 client [CLIENT_NAME]
      

      在完成 p4 命令之前,您将被移至文件编辑器。这 允许您在将任何客户端设置发送到 服务器。您必须将 Root 值更改为您之外的新目录 git 树(例如 ../p4-working)另外,验证 OwnerClient 退出前的值。这些值取自您的环境,并且 无法在编辑器中更改。

      p4 clients | grep USERNAME
      

      如果您没有使用默认客户端名称,则必须在本地定义 git 配置:

      git config git-p4.client CLIENT_NAME
      

      当您准备好推送代码更改时,请使用以下命令:

      git p4 rebase
      git p4 submit
      

      您可以在不再使用时从服务器中删除客户端:

      p4 client -d CLIENT_NAME
      

    【讨论】:

    • 你错过了 --add 在第二个git config --add git-p4.branchList main:dev
    【解决方案2】:

    在 Git 2.30(2021 年第一季度)中,“git(man) p4”现在支持 init.defaultBranch 配置。

    这可能是detect-branches--branch 的替代解决方案:

    参见Johannes Schindelin (dscho)commit 1b09d19(2020 年 11 月 8 日)。
    (由 Junio C Hamano -- gitster -- 合并于 commit ca8870d,2020 年 11 月 11 日)

    p4:尊重init.defaultBranch

    签字人:约翰内斯·辛德林

    git p4 clone 中,我们硬编码分支名称master,而不是查看实际初始分支名称是什么。
    让我们解决这个问题。

    【讨论】:

      【解决方案3】:

      我相信“检测分支”依赖于您拥有与仓库中的分支路径同名的分支映射。如果不是这种情况,您可能需要在运行 git-p4 clone 命令之前在空的 git repo 中使用 suggested method 定义 git-p4.branchList 配置值。

      【讨论】:

      • 啊,这很有道理。我想知道分支检测“魔术”是如何工作的。我会试试这个。谢谢。
      • 这仍然不适合我。我怀疑至少在我们的一些分支上合并已经双向进行了,这给 git-p4 的工作带来了麻烦。
      • 它过去曾在一个非常大的仓库中为我工作过,其中有一个我见过的最令人困惑的分支/合并。由于 git-p4 是用 python 编写的,实际上调试起来并不难。
      【解决方案4】:

      答案太晚了,但是关于 git-p4 的文档太少了,我希望它仍然有用。

      我还努力将分支添加到现有存储库,但从未获得 detect-branches 魔法来处理分支映射。

      我在手动阶段中取得了更大的成功,明确告诉 git-p4 要导入哪个路径并使用--branch 选项。我相信我还在现有存储库中手动创建了release 分支,然后再运行它。

      对于这个问题,那就是git p4 sync //depot/path/to/project/release --branch=release

      我相信这也可以使用clone 工作,因为克隆主要只是在 git-p4 代码的幕后同步,但是一旦你已经有了一个存储库,我认为sync 会更安全。

      【讨论】:

        猜你喜欢
        • 2012-08-06
        • 2021-06-26
        • 2016-03-23
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        相关资源
        最近更新 更多