3

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

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

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

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

4

1 回答 1

2

引用git apply手册:

如果补丁包含对子模块的任何更改,那么 git apply 会按如下方式处理这些更改。

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

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

换句话说,你必须--index注意git apply子模块。

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

于 2012-02-16T18:15:24.130 回答