2013-03-20 124 views
5

最近我遇到了使用git-p4的问题。git p4提交:补丁不适用

我现在的工作流程是:

git checkout -b some_feature 
# do some work and commit to some_feature branch 
git checkout master 
git merge --no-ff some_feature 
git p4 rebase 
git p4 submit 

并非总是如此,但偶尔执行git p4 submit时,所做的更改不会实际应用,而是我看到:

error: some_file.extension: patch does not apply 

做一些研究,我已经尝试在主设备上进行硬重设,并在没有--no-ff标志的情况下重新合并,但这似乎没有帮助。

任何想法,不胜感激。

+0

这些工作是否适合您? 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

回答

4

我有这个相同的问题,我认为根本原因是行结束。你可以尝试运行的东西像dos2unix修复它,或设置此配置:

git config --global core.autocrlf true 

有时候,文件模式可能会导致问题。这个配置可以修复它(如果你不关心文件模式):

git config core.filemode false 
6

今天我遇到了这个问题。在我的情况下,这个问题是因为我的文本编辑器(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 documentationcleansmudge细节。)

诊断问题

我认为错误消息很有趣:

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//'