48

我试着做

git diff 13.1_dev sale_edit > patch.diff

然后我尝试git apply patch.diff在另一个分支中做,但我得到的补丁不适用。如何从可以与 git apply 一起使用的差异创建补丁文件?

收到的错误:

$ git apply --ignore-space-change --ignore-whitespace diff.diff 
diff.diff:9: trailing whitespace.

diff.diff:10: trailing whitespace.
    function set_change_sale_date() 
diff.diff:12: space before tab in indent.
      $this->sale_lib->set_change_sale_date($this->input->post('change_sale_date'));
diff.diff:14: trailing whitespace.

diff.diff:15: trailing whitespace.
    function set_change_sale_date_enable() 
warning: application/controllers/sales.php has type 100755, expected 100644
error: patch failed: application/controllers/sales.php:520
error: application/controllers/sales.php: patch does not apply
warning: application/language/english/sales_lang.php has type 100755, expected 100644
error: patch failed: application/language/english/sales_lang.php:134
error: application/language/english/sales_lang.php: patch does not apply
warning: application/libraries/Sale_lib.php has type 100755, expected 100644
error: patch failed: application/models/sale.php:170
error: application/models/sale.php: patch does not apply
warning: application/views/sales/register.php has type 100755, expected 100644
error: patch failed: application/views/sales/register.php:361
error: application/views/sales/register.php: patch does not apply

我在 Mac 上试试这个

4

4 回答 4

33

尝试一个:

git apply --ignore-space-change --ignore-whitespace patch.diff

如“ git:patch does not apply ”中所述,这可能是由以下原因引起的:

  • 本地文件系统和远程仓库之间的行尾不同。
    文件中的用户core.eol.gitattributes一个很好的方法(请参阅“ git force file encoding on commit ”)
  • 执行位(' x')。
    这可能会导致您设置git config core.filemode false,然后是 a git reset --hard HEAD(确保您没有未提交的更改,否则它们会丢失)。
于 2013-04-14T00:07:26.230 回答
18

您可以将补丁应用为 3 路合并:

git diff 13.1_dev sale_edit > patch.diff
git apply -3 patch.diff

它应该会引发冲突,以便您可以手动解决。或者您可以使用单线,将补丁直接通过管道传递到 git-apply:

git diff 13.1_dev sale_edit | git apply -3

要反转补丁:

git diff 13.1_dev sale_edit | git apply -3 -R

(注意:这和上面的命令一样,没有创建补丁文件的两阶段过程)

git help apply

-3, --3way           
When the patch does not apply cleanly, fall back on 3-way merge if 
the patch records the identity of blobs it is supposed to apply to, 
and we have those blobs available locally, possibly leaving 
the conflict markers in the files in the working tree for the user 
to resolve...
于 2015-03-07T12:45:04.427 回答
1

在这里,您必须使用具有差异的分支进行尝试。

git diff 13.1_dev sale_edit > patch.diff yourBranch()
于 2013-06-07T09:07:26.583 回答
1

在 git 版本 1.9.1 中,当使用“git apply”应用使用“git diff”创建的补丁时,我看到了类似的抱怨。

似乎 1.9.1 git 在处理补丁文件中的空格和制表符混合时遇到了问题。

warning: squelched 1 whitespace error warning: 6 lines add whitespace errors.

@VonC 的回答没有帮助,我仍然收到同样的警告。

最简单的解决方案是简单地使用“补丁”命令,该命令成功地将“git diff”输出中捕获的所有更改应用到目标 git 目录。

$ patch --version GNU patch 2.7.1

于 2018-01-08T22:23:21.990 回答