今天我遇到了这个问题。在我的情况下,这个问题是因为我的文本编辑器(Visual Studio)为它所触及的每个文件添加了一个Unicode BOM。同时,Perforce服务器被设置为从每个文件中去除Unicode BOM,从而防止出现在Perforce中的Unicode BOM。这最终导致我git p4 submit
失败,出现以下消息:
error: patch failed: path/to/file.csproj:1
error: path/to/file.csproj: patch does not apply
最终解决
我在〜/的.gitconfig文件添加以下过滤器定义:
[filter "utf8-autobom"]
clean = sed -b -e '1!b' -e 's/^\\xEF\\xBB\\xBF//'
smudge = sed -b -e '1!b' -e 's/\\(^\\|^\\xEF\\xBB\\xBF\\)/\\xEF\\xBB\\xBF/'
然后我通过在.gitattributes中添加以下行,将utf8-autobom
过滤器应用于违规文件:
*.csproj filter=utf8-autobom
然后我强迫的Git的过滤器适用于它的指数有:
rm .git/index
git reset
然后,我犯了编辑的文件到Git和提交了我的承诺Perforce公司和往常一样:
git add .
git commit --amend
git p4 submit
工作原理
过滤器定义基于以下sed
命令,其中“abc”是一个地方为适当的Unicode BOM字节序列保持器:
# Remove 'abc' from beginning of file, if present
sed -b -e '1!b' -e 's/^abc//'
# Add 'abc' to beginning of file, if not present
sed -b -e '1!b' -e 's/\(^\|^abc\)/abc/'
对于UTF-8 BOM中,我们使用该字节序列EF BB BF
代替 “ABC”。
该过滤器通过运行clean
命令删除提交时的BOM,并通过运行smudge
命令在签出时添加物料清单。这会将BOM保留在工作树文件中,但会阻止将BOM提交给Git或提交给Perforce。
(请参阅gitattributes documentation对clean
和smudge
细节。)
诊断问题
我认为错误消息很有趣:
error: patch failed: path/to/file.csproj:1
error: path/to/file.csproj: patch does not apply
它说,该补丁失败在第1行,即使我的提交没有编辑文件的第1行。
为了看看发生了什么,我跑了git diff p4/master HEAD
。差异表明我的提交在文件的开头添加了一个奇怪的<U+FEFF>
字符。我怀疑它与文件编码有关,所以我使用Notepad ++在我的Git工作树中打开该文件。然后我在我的Perforce工作区中打开相应的文件。 Notepad ++在我的Git工作树中显示编码为“UTF-8-BOM”,而在我的Perforce工作区中显示为“UTF-8”。 (Linux和Cygwin的用户:使用file <path-to-file>
命令可显示有关文件的编码信息。)
谷歌搜索 “UTF-8-BOM” 让我在正确的道路上。
通知
安装此筛选器后,某些Git操作将会变慢。
提示
您可以删除过滤器的smudge
部分,如果你不需要BOM在你的工作树。这将加快一些Git操作(如git checkout
)。随着smudge
行被删除,过滤器定义为:
[filter "utf8-autobom"]
clean = sed -b -e '1!b' -e 's/^\\xEF\\xBB\\xBF//'
这些工作是否适合您? http://stackoverflow.com/questions/9042865/git-p4-submit-fails-with-patch-does-not-apply http://stackoverflow.com/questions/15953609/git-p4-submit-fails – Philip 2013-08-08 20:30:58