如何仅为更改特定文件的提交生成/应用git补丁

EMi*_*ler 5 git git-diff git-patch

我有两个git repos,它们是彼此的分叉,我需要偶尔将提交从一个提交到另一个.

例如:

git-repo1 有这个目录结构:

repo1/project1/src

repo1/project2/src

while git-repo2具有以下目录结构:

repo2/src/

我想要做的是进行一系列提交并仅为改变特定子目录(例如repo1/project1/src)中的文件的提交生成补丁,并忽略所有仅在其他地方改变文件的提交.

或者,为所有提交生成修补程序,但仅在应用程序修改特定目录中的文件时应用修补程序.

我需要保留有关提交的元数据,因此使用git diff它似乎不是一个可行的选项.

forked git repos之间的目录结构不同.

有没有直接的方法来做到这一点?

UPDATE1

在处理不同的目录结构方面,我看到了这个问题(如何将git补丁从一个存储库应用到另一个存储库?)

但是,如果修补程序谈到修改根本不存在的文件会怎么样?我想忽略这些变化.

jth*_*ill 9

git rev-list --reverseseries-- repo1/project1/src/ \
| xargs -I@ git format-patch --stdout @^! >mystuff.patch

会将影响该子目录的系列提交吐出mystuff.patch

然后,

cat >mystuff.sed <<\EOD
/^(From [0-9a-f]{40}|diff --git )/!{H;$!d}
x
/^From /b
${h;s,.*--,--,;x}
\,^diff[^\n]* [ab]/repo1/project1/src/,!{$!d;x;b}
${p;x}
EOD
Run Code Online (Sandbox Code Playgroud)

sed -Ef mystuff.sed mystuff.patch >justmystuff.patch
Run Code Online (Sandbox Code Playgroud)

将剥离该目录之外的所有帅哥.你可以申请

git am justmystuff.patch
Run Code Online (Sandbox Code Playgroud)

-pn--directory=new/path/to如需要的话.

(编辑:EOD - >\EOD所以上面的猫不会试图替换)

  • 如果您能对您的 sed 脚本进行解释,那就太好了! (2认同)