我尝试在一个存储库上运行 git p4 Submit,我一直在运行该存储库作为 git 和 perforce 之间的临时桥梁。许多人正在使用该存储库作为远程仓库,并且它会定期提交回 perforce。
它大部分工作得很好,除了一些重复的强制提交,我似乎无法重现其奇怪的行为。然后有一天我突然收到这个错误。我无法再将任何 git 提交推送到 perforce。
user@hostname:~/Source/code$ git p4 submit -M --export-labels
Perforce checkout for depot path //depot/perforce/workspace/ located at /home/user/Source/git-p4-area/perforce/workspace/
Synchronizing p4 checkout...
... - file(s) up-to-date.
Applying ffa390f comments in config xml files
//depot/perforce/workspace/sub/folder/structure/first.xml#3 - opened for edit
//depot/perforce/workspace/sub/folder/structure/second.xml#3 - opened for edit
//depot/perforce/workspace/sub/folder/structure/third.xml#3 - opened for edit
//depot/perforce/workspace/sub/folder/structure/forth.xml#3 - opened for edit
//depot/perforce/workspace/sub/folder/structure/fifth.xml#1 - opened for edit
error: patch failed: sub/folder/structure/first.xml:1
error: sub/folder/structure/first.xml: patch does not apply
error: patch failed: sub/folder/structure/second.xml:1
error: sub/folder/structure/second.xml: patch does not apply
error: patch failed: sub/folder/structure/third.xml:1
error: sub/folder/structure/third.xml: patch does not apply
error: patch failed: sub/folder/structure/forth.xml:1
error: sub/folder/structure/forth.xml: patch does not apply
error: patch failed: sub/folder/structure/fifth.xml:1
error: sub/folder/structure/fifth.xml: patch does not apply
Unfortunately applying the change failed!
//depot/perforce/workspace/sub/folder/structure/first.xml#1 - was edit, reverted
//depot/perforce/workspace/sub/folder/structure/second.xml#3 - was edit, reverted
//depot/perforce/workspace/sub/folder/structure/third.xml#3 - was edit, reverted
//depot/perforce/workspace/sub/folder/structure/forth.xml#3 - was edit, reverted
//depot/perforce/workspace/sub/folder/structure/fifth.xml#3 - was edit, reverted
No commits applied.
这个错误看起来很像这个错误:
除了我没有做任何关键字替换,所以我不知道它可能是什么。添加
--verbose
似乎并不能帮助解释太多(我手头没有该命令输出)
我能想象到的唯一变化是我在提交时添加了一个 .gitattributes 文件,其中包含以下内容。但是,在 gitattributes 文件就位时在此提交之前所做的提交确实有效,所以不可能是这样(我已经使 .gitattributes 文件更详细)
* text eol=lf
我尝试将此远程存储库中的提交回滚到此违规提交之前,然后将它们从我的存储库重新推送到此远程存储库,然后重新提交。同样的行为。我尝试回滚,并对同一文件进行不同的编辑,重新推送,重新提交。同样的行为。而且这种情况似乎只发生在这些文件上。自从回滚以来,我尝试对其他文件进行编辑并且它们有效。我尝试运行 dos2unix 来强制在有问题的文件上使用 unix 行结尾,但这也没有解决问题。
什么命令可以让我更好地解释这里发生的事情?有没有我可以追踪的 git 日志文件?任何帮助将不胜感激。
编辑:我已经在使用和不使用 .gitattributes 文件的情况下重新测试了我的问题。这没有什么区别。目前我的全局 core.autocrlf 设置已输入。但由于缺少 .gitattributes 文件,这似乎没有什么区别。这是我在打开
--verbose
的情况下仅使用一个有问题的文件重新测试它时的样子。
user@hostname:/code$ git p4 submit -M --export-labels --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 0457c7589ea679dcc0c9114b34f8f30bc2ee08cf
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/perforce/workspace/...']
Perforce checkout for depot path //depot/perforce/workspace/ located at /home/user/Source/git-p4-area/perforce/workspace/
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.detectCopies']
Reading pipe: ['git', 'config', '--bool', 'git-p4.detectCopiesHarder']
Reading pipe: ['git', 'show', '-s', '--format=format:%h %s', 'ef3b95f5fec193fe2612b28e2e3b5e7f8ba9419e']
Applying ef3b95f making test change
Opening pipe: p4 -G users
Reading pipe: ['git', 'log', '--max-count=1', '--format=%ae', 'ef3b95f5fec193fe2612b28e2e3b5e7f8ba9419e']
Reading pipe: git diff-tree -r -M "ef3b95f5fec193fe2612b28e2e3b5e7f8ba9419e^" "ef3b95f5fec193fe2612b28e2e3b5e7f8ba9419e"
//depot/perforce/workspace/sub/folder/structure/first.xml#3 - opened for edit
<stdin>:17: trailing whitespace.
<!-- comment line 1 -->
<stdin>:18: trailing whitespace.
<!-- comment line 2 -->
<stdin>:19: trailing whitespace.
<!-- comment line 3 -->
error: patch failed: sub/folder/structure/first.xml:1
error: sub/folder/structure/first.xml: patch does not apply
Unfortunately applying the change failed!
Reading pipe: ['git', 'config', '--bool', 'git-p4.attemptRCSCleanup']
//depot/perforce/workspace/sub/folder/structure/first.xml#3 - was edit, reverted
No commits applied.
Reading pipe: ['git', 'config', '--bool', 'git-p4.exportLabels']
Opening pipe: ['p4', '-G', 'labels', '//depot/ipstor.maple/automation/...']
Reading pipe: ['git', 'tag']
Reading pipe: ['git', 'config', 'git-p4.labelExportRegexp']
我想通了。该问题是由行结尾引起的。我使用不同的文件重新测试了该问题,在这种情况下,错误是由于在 perforce 工作区中检出的文件的行结尾是 win 风格的 crlf 以及 git 存储库中的文件的行结尾是 unix 风格引起的LF.
在这种情况下,我在 perforce 中检查了该文件,对其运行 dos2unix 并提交,然后运行 git p4 Submit 并且它起作用了。
这不是真正的解决方案。这只是解决方法。我向 git 的邮件列表发送了一封电子邮件,请求修复。 http://marc.info/?l=git&m=136630231402536&w=2
对我来说,设置后提交就成功了
git config apply.ignorewhitespace change
。
我认为发生错误是因为 git
core.whitespace
设置默认是有限制的:
默认开启的是blank-at-eol,看起来 用于行尾的空格; Blank-at-eof,注意到空白 文件末尾的行;和 tab 前的空格,它会查找 行首制表符前有空格。
(参见 http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration)
设置
apply.ignorewhitespace change
允许 git apply
修复这些错误。将 core.whitespace
设置更改为限制性较小也应该可以解决问题,但我还没有尝试过。
请注意,如果不进行变基操作,
git p4 submit
可能会失败。因此,请务必在提交之前运行 git p4 rebase
。
编辑:我遇到了另一个问题
git p4
。在 git commit 中,我重命名了一个本地文件。当我运行 git p4 submit
时,我收到了与上面相同的错误消息“补丁不适用”。
我注意到 Perforce 中补丁失败的两个文件的文件类型是
utf8
。我在P4V中将其更改为text
。更改后,git p4 submit
将成功运行。