我有一个git repo foo
,它在自己的文件夹bar
和baz
中有几个子模块(实际的repo是eclipse.platform.releng.aggregator)。我需要生成补丁以更改那些回购。
我可以使用git --no-pager diff > file.patch
生成一个补丁,该补丁适用于foo
的更改,但不会报告bar
或baz
子模块中的更改。
使用git submodule --quiet foreach --recursive git --no-pager diff > file
(来自this answer)几乎可以正常工作,但差异不包括子版块所在文件夹的名称。
目前我通过手工修改补丁的路径来解决这个问题,但这只适用于简单的补丁和我能想到的脚本解决方案(例如从git获取subrepo名称,更改为文件夹,生成补丁)文件夹)意味着我以后不能使用简单的git apply
重新应用补丁。
有没有办法让git直接区分subrepos而不是foreach,这样可以简单地应用生成的补丁?
答案 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
提交后创建补丁,则更有意义。