如何将补丁应用于git子树合并?

时间:2012-02-16 18:10:38

标签: git merge patch subtree

我通过子树合并将一个子项目添加到git存储库。我现在需要在子项目中应用补丁,但运行“git apply -v patch_name.patch”不会返回任何内容。没有错误消息,也没有任何文件被更改。

我已经尝试单独克隆子项目(即,进入子目录/ tmp)并将其与主项目下子项目目录中的内容进行比较;目录是一样的。

当我在/ tmp下对克隆运行补丁时,它会按预期应用。似乎问题与子项目目录是子树合并的结果有关。

我想我可以修补新克隆下的文件,然后将它们复制到我的主项目下的子项目目录中。看来我不应该这样做。有更好的解决方法吗?

1 个答案:

答案 0 :(得分:2)

引用git apply手册:

  

如果补丁包含对子模块的任何更改,则git apply treats   这些变化如下。

     

如果指定了--index(显式或隐式),则子模块提交必须与要应用的修补程序的索引完全匹配。   如果检出任何子模块,那么这些   退房完全被忽略,即它们不需要是最新的或干净的,并且不会更新。

     

如果未指定--index,则忽略补丁中的子模块提交,并且仅忽略或存在   检查相应的子目录并(如果可能)更新。

换句话说,您必须为--index提供git apply来关注子模块。

如果要“强制”更改,可以考虑使用普通的patch命令,尽管它不会获得权限更改等,或者在子树上使用git checkout rev /path/to/dir (或您建议的手册)。