Git P4 在 Cygwin 下提交失败,提示 "Patch does not apply"。

3
我正在尝试在Cygwin下使用git-p4。 工作流程中的“克隆”和“更新”部分似乎正常工作,但我无法“提交”。 我猜可能与换行符约定有关。 我已查看了此 git-p4问题及其链接项目,但目前对换行符和空格配置的处理都不成功。 我配置中需要注意的事项如下:
(1)我使用bash shell函数技巧来正确获取路径。
$ type p4
p4 is a function
p4 () 
{ 
    P4=`which p4`;
    PWD=$(cygpath -wa .) "${P4}" "$@"
}

(2) 我已经尝试了git的autocrlf值的所有设置 -- 结果是失败的,不管是(true,false,input)。目前正在尝试将其设置为"false",因为这在与工作库进行差异比较时最有意义。
(3) 我还尝试过更改p4 clientspec的lineend值; 目前正尝试"unix",因为我使用的是Cygwin和运行在OSX下的P4沙盒服务器。
测试很简单。仓库中只包含一个名为foo1的文件。depot版本如下(使用od -c输出):
0000000   f   o   o   1  \n  \n
0000006

本地提交的git版本如下:
0000000   f   o   o   1       i   s       t   h   e       o   n   e   !
0000020  \n  \n
0000022

我已经在git-p4的applyCommit()方法中添加了一些额外的诊断输出。结合使用--verbose运行提交,可以更好地进行故障排除:

 $ git p4 submit --verbose
 Reading pipe: git name-rev HEAD
 Reading pipe: ['git', 'config', 'git-p4.allowSubmit']
 Reading pipe: git rev-parse --symbolic --remotes
 Reading pipe: git rev-parse p4/master
 Reading pipe: git cat-file commit ce414288d1b5d52dbad20c1a29f1875cfff7c281
 Reading pipe: git cat-file commit HEAD~0
 Reading pipe: git cat-file commit HEAD~1
 Reading pipe: ['git', 'config', 'git-p4.conflict']
 Origin branch is remotes/p4/master
 Reading pipe: ['git', 'config', '--bool', 'git-p4.useclientspec']
 Opening pipe: ['p4', '-G', 'where', '//depot/foo/...']
 Perforce checkout for depot path //depot/foo/ located at c:\git\foo\
 Synchronizing p4 checkout...
 ... - file(s) up-to-date.
 Opening pipe: p4 -G opened ...
 Reading pipe: ['git', 'rev-list', '--no-merges', 'remotes/p4/master..master']
 Reading pipe: ['git', 'config', '--bool', 'git-p4.skipUserNameCheck']
 Reading pipe: ['git', 'config', 'git-p4.detectRenames']
 Reading pipe: ['git', 'config', 'git-p4.detectCopies']
 Reading pipe: ['git', 'config', '--bool', 'git-p4.detectCopiesHarder']
 Reading pipe: ['git', 'show', '-s', '--format=format:%h %s', '2303176ae8c575313616ae2c4a35358258742598']
 Applying 2303176 updating foo1
 Opening pipe: p4 -G users
 Reading pipe: ['git', 'log', '--max-count=1', '--format=%ae', '2303176ae8c575313616ae2c4a35358258742598']
 Reading pipe: git diff-tree -r  "2303176ae8c575313616ae2c4a35358258742598^" "2303176ae8c575313616ae2c4a35358258742598"
 //depot/foo/foo1#1 - opened for edit
 Sanity: git diff-tree --full-index -p "2303176ae8c575313616ae2c4a35358258742598" | git apply --verbose --check -
 Checking patch foo1...
 error: while searching for:
 foo1


 error: patch failed: foo1:1
 error: foo1: patch does not apply
 Unfortunately applying the change failed!
 Reading pipe: ['git', 'config', '--bool', 'git-p4.attemptRCSCleanup']
 //depot/foo/foo1#1 - was edit, reverted

请注意“Sanity:”诊断行。这是applyCommit()方法内失败的tryPatchCmd值。如果我在bash命令行上执行语句的第一部分,我会看到:
 2303176ae8c575313616ae2c4a35358258742598
 diff --git a/foo1 b/foo1
 index 630baf44b0874b3319c2814399f0b03106912183..4c23e4512b3347ec31068e464b64cbd99851cc9a 100644
 --- a/foo1
 +++ b/foo1
 @@ -1,2 +1,2 @@
 -foo1
 +foo1 is the one!

将此管道传输到命令的第二部分不会出现错误。当使用Python脚本中的os.system()执行该命令失败时,我感到困惑,但其他情况下则成功。你有何想法?
1个回答

3
我相信我已经解决了这个问题。问题有两个方面。第一个罪状——没有仔细阅读手册。Submit部分的文档指出:
提交来自Git存储库到p4存储库需要单独的p4客户端工作空间。这应该使用P4CLIENT环境变量或Git配置变量git-p4.client指定。p4客户端必须存在,但是如果不存在,则将创建并填充客户端根。
我花了一些时间才明白这实际上意味着要有两个物理工作副本——一个用于git,一个用于p4。git-p4脚本试图在同一个文件夹中执行git和p4操作时失败了,而且这样的原地操作与Perforce的检出模型不兼容。我通过在Mac上执行相同的测试工作流程发现了这一点,它会更清楚地报告“无法覆盖可写文件”的错误。通过在p4 clientspec中调整“clobber”,我能够让Mac和Cygwin的提交工作,并找到了正确的路径。
这个Perforce页面上有关于设置双工作区结构的详细步骤。
第二个问题:有趣的是,在Cygwin环境中,我仍然需要--ignore-whitespace作为git apply逻辑的一部分。这是我愿意接受的git-p4 hack。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接