git 主分支上的PR,作为文件结构不同的旧版本分支的补丁

xpcnnkqh  于 2023-02-02  发布在  Git
关注(0)|答案(1)|浏览(140)

我有下面的场景:
1.在main分支(我们称之为PR-1234)上创建 * 并合并 * 了一个PR,其中包含一系列修复
1.我需要将相同的修复应用到一些较旧的版本分支(例如release/1.1release/1.2)。
警告是这些分支比我的main分支 * 更老 *。有些文件可能不存在,或者有不同的名称。
所以我想我应该:
1.到原PR的patch-diff.githubusercontent.com/raw/.../1234.patch获取电子邮件格式的补丁,另存为文件,如~/1234.patch
1.从release/1.1创建一个新分支,并使用git am ~/1234.patch将步骤1中的修补程序应用到新分支。
1.解决冲突,根据需要进行一些手动更改,并合并到release/1.1
但是,当我运行git am时,会得到如下输出

Applying: xxx changed: refactoring ClassName
.git/rebase-apply/patch:80: trailing whitespace.
    
.git/rebase-apply/patch:82: trailing whitespace.
    
.git/rebase-apply/patch:136: trailing whitespace.
        
.git/rebase-apply/patch:139: trailing whitespace.
        
.git/rebase-apply/patch:150: trailing whitespace.
        
error: [file1]: does not exist in index
error: [file2]: does not exist in index
error: [file3]: does not exist in index
error: [file4]: does not exist in index
Patch failed at 0001 xxx changed: refactoring ClassName
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

很明显,分支之间的差异太大,无法应用补丁。这是我可以解决的问题吗?如何解决?或者有没有其他方法可以将PR 1234中的 * 大多数更改 * 应用到另一个较旧的分支,只需 * 一些 * 手动操作。我的目标当然是避免在所有分支上逐行手动更改。
先谢了。

z8dt9xmd

z8dt9xmd1#

以下是git applygit am的一些选项,可能会有所帮助。

  1. --include=<path>
    它只应用指定路径的差异。例如,--include=foo/bar/*--include=foo/bar/baz.c。可以使用多个--include。使用此选项,我们不必将补丁拆分为更小的补丁。
  2. --exclude=<path>
    不应用指定路径的差异。
  3. --directory=<root>
    假设补丁中的路径是x/y/z.c,而你的代码中的路径是a/b/x/y/z.c,在这种情况下,我们可以使用--directory=a/b,这样diff就会应用到a/b/x/y/z.c
  4. -p<n>
    假设补丁中的路径为foo/bar/a.c,而代码中的路径为foi/baz/a.c,文件名相同,其父路径不同。
diff --git a/foo/bar/a.c b/foo/bar/a.c

前导的a/是源前缀,b/是目标前缀。大多数情况下,它们是a/b/。它们可以是其他字符或不存在。
我们可以使用-p3 --include=foo/bar/a.c --directory=foi/bazfoo/bar/a.c应用于foi/baz/a.c-p<n>删除了n的前导组件(由斜杠分隔,n默认为1)。在示例中,它是a/foo/bar,有3个组件。-p3 --include=foo/bar/a.c指示将a/foo/bar/a.c的diff应用到a.c。但是,目的路径是foi/baz/a.c,所以我们添加--directory=foi/baz
如果补丁中的路径与代码中的路径完全不同,我认为我们必须手动编辑补丁中的路径。

相关问题