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) 是什么结果都是失败的。目前尝试“假”,因为这在与仓库进行比较时最有意义。

(3) 我也玩过 p4 clientspec 的 lineend 值;目前正在尝试“unix”、Cygwin 的 b/c 和在 OSX 下运行的 P4 沙箱服务器。

测试很简单。存储库包含一个文件 foo1。仓库版本看起来像(使用输出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

applyCommit()在 git-p4 的方法中添加了一些额外的诊断输出。结合使用 --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

注意“理智:”诊断行。这是方法tryPatchCmd中失败的值applyCommit()。如果我在 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!

将其连接到命令的第二部分不会导致错误。我很困惑为什么os.system()在 Python 脚本中使用命令执行失败但否则成功。想法?

4

1 回答 1

3

我相信我已经解决了这个问题。问题有两个方面。第一个大罪——没有仔细阅读手册。提交部分中的 文档指出:

将 Git 存储库中的更改提交回 p4 存储库需要单独的 p4 客户端工作区。这应该使用 P4CLIENT 环境变量或 Git 配置变量 git-p4.client 来指定。p4 客户端必须存在,但如果客户端根不存在,则将创建并填充它。

我花了一些时间才明白这实际上意味着两个物理工作副本——一个用于 git,一个用于 p4。git-p4 脚本在尝试在同一个文件夹中执行 git 和 p4 操作时感到窒息,并且这种就地操作与 Perforce 的结帐模型不兼容。我通过在 Mac 上执行相同的测试工作流程发现了这一点,该工作流程 [更清楚地] 出现“无法破坏可写文件”的错误。通过在 p4 客户端规范中玩弄“clobber”,我能够在 Mac 和 Cygwin 中提交工作,这让我走上了正确的道路。

在这个 Perforce 页面上有关于设置双工作区结构的详细演练。

第二:有趣的是,我似乎仍然需要在 Cygwin 环境中--ignore-whitespace作为逻辑的一部分。git apply这是git-p4我愿意忍受的黑客。

于 2015-05-12T01:16:31.810 回答