【问题标题】:Create patch or diff file from git repository and apply it to another different git repository从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库
【发布时间】:2015-03-27 08:59:45
【问题描述】:

我从事基于 WordPress 的项目,我想在每个新发布的 WP 版本中修补我的项目。为此,我想在两个提交或标签之间生成一个补丁。

例如,在我的 repo /www/WP 我这样做:

$ git patch-format com1..com2 --stdout > '~/patchs/mypatch.patch'

# or

$ git patch-format tag1..tag2 --stdout > '~/patchs/mypatch.patch'

/www/WPgit natif WordPress

/www/myproject我的git项目基于WordPress

git apply 命令行不起作用,我认为是因为我们位于不同的存储库中。

我可以在没有提交的情况下生成一个补丁文件,只是一个差异并将其应用到另一个 git 存储库吗?

谢谢。

【问题讨论】:

    标签: git diff patch git-diff git-apply


    【解决方案1】:

    您可以只使用git diff 来生成适合git applyunified diff

    git diff tag1..tag2 > mypatch.patch
    

    然后您可以通过以下方式应用生成的补丁:

    git apply mypatch.patch
    

    【讨论】:

    • 谢谢 Enrico,我使用了 $git diff -u tag1..tag2 > mypatch.patch$git apply --stat > mypatch.patch 答案是 0 files changed 任何其他建议好吗? :)
    • 您需要将补丁文件的路径指定为git apply的参数。我用一个例子更新了我的答案。
    • 我使用了git diff -p tag1 tag2 > my.patch,效果很好。
    • 如何制作统一差异格式的补丁? sourceware.org/glibc/wiki/…Only unified diff (-uNr) format is acceptable. 但是当我尝试 git diff -uNr tag1..tag2 > mypatch.patch 我收到消息 usage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
    • 小心git diff ... + git apply ... 不正确处理已删除/移动的文件......当git format-patch ... + git am ... 这样做时。
    【解决方案2】:

    要为多个提交生成补丁,您应该使用format-patch git 命令,例如

    git format-patch -k --stdout R1..R2
    

    这会将您的提交以邮箱格式导出到补丁文件中。

    要为最后一次提交生成补丁,运行:

    git format-patch -k --stdout HEAD~1
    

    然后在另一个存储库中通过am git 命令应用补丁,例如

    git am -3 -k file.patch
    

    请参阅:man git-format-patchgit-am

    【讨论】:

    • 可以用patch -p1 应用的补丁怎么样? sourceware.org/glibc/wiki/…
    • 我正在将补丁从 linux 移动到 winodws,因此必须使用这里提到的 --ignore-whitespace stackoverflow.com/questions/13190679/…
    • @AaronFranke,你可以试试'-p'选项:git format-patch -p HEAD^1
    • 注意,这样做的好处是可以保留原始提交的提交消息、作者和提交日期。
    • --stdout 会将输出转储到终端,您需要使用> file.patch 进行管道传输。或者,如果您不包含--stdout,它会生成格式为nnnn-commt-message.patch 的文件(其中nnnn 是从0001 开始的滚动数字)。
    【解决方案3】:

    你可以应用两个命令

    1. git diff --patch > mypatch.patch // 生成补丁`
    2. git apply mypatch.patch // 应用补丁`

    【讨论】:

      【解决方案4】:

      作为补充,要为一个特定的提交生成补丁,请使用:

      git format-patch -1 <sha>
      

      生成补丁文件时,请确保您的其他 repo 在您使用 git am ${patch-name} 时知道它在哪里

      在添加补丁之前,使用git apply --check ${patch-name}确保没有冲突。

      【讨论】:

        【解决方案5】:

        你甚至可以只为你当前所在的子目录打补丁。只需添加.

        git format-patch -k b365cce8..80a2c18a .
        

        然后你就可以应用它们了:

        git am *.patch
        

        详情请见this answer

        【讨论】:

          猜你喜欢
          • 2010-10-30
          • 2012-07-16
          • 1970-01-01
          • 2012-05-12
          • 1970-01-01
          • 2020-10-25
          • 2018-03-18
          • 1970-01-01
          • 2018-01-11
          相关资源
          最近更新 更多