为git repo和子模块生成未提交的更改补丁

时间:2016-04-15 11:47:22

标签: git version-control git-submodules

我有一个git repo foo,它在自己的文件夹barbaz中有几个子模块(实际的repo是eclipse.platform.releng.aggregator)。我需要生成补丁以更改那些回购。

我可以使用git --no-pager diff > file.patch生成一个补丁,该补丁适用于foo的更改,但不会报告barbaz子模块中的更改。

使用git submodule --quiet foreach --recursive git --no-pager diff > file(来自this answer)几乎可以正常工作,但差异不包括子版块所在文件夹的名称。

目前我通过手工修改补丁的路径来解决这个问题,但这只适用于简单的补丁和我能想到的脚本解决方案(例如从git获取subrepo名称,更改为文件夹,生成补丁)文件夹)意味着我以后不能使用简单的git apply重新应用补丁。

有没有办法让git直接区分subrepos而不是foreach,这样可以简单地应用生成的补丁?

2 个答案:

答案 0 :(得分:1)

借助@larsks提供的线索,我设法找到了以下一个能满足我需求的衬垫:

git submodule --quiet foreach --recursive 'export NAME="${PWD##*/}"; git --no-pager diff --src-prefix="a/${NAME}/" --dst-prefix="b/${NAME}/"'

这会将子文件夹的文件夹名称添加到使用git diff生成的修补程序中,因此即使修补程序跨越多个子模块,我也可以在父文件夹中运行git apply。但请注意,它只能起作用,因为我的子模块都是主repo文件夹下面的一个文件夹。如果需要,可以通过将用于设置NAME的代码更改为更聪明的东西来克服这一点。

答案 1 :(得分:0)

对于子模块,我们的想法是每个repo都是独立的,它可能由不同的维护者支持,并且具有不同的批准过程。此外,可以单独检查回购,甚至可以作为子模块完全不同的回购的一部分。

所以,这里的方法是为每个repo独立创建补丁集并独立传递它们。如果在使用git format-patch提交后创建补丁,则更有意义。