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

如何仅为更改特定文件的提交生成/应用git修补程序,git,git-diff,git-patch,Git,Git Diff,Git Patch,我有两个git回购协议,它们是彼此的分支,我需要偶尔将提交从一个导入到另一个 例如: git-repo1具有以下目录结构: repo1/project1/src repo1/project2/src 而git-repo2具有以下目录结构: repo2/src/ 我想做的是接受一系列提交,并仅为更改了特定子目录中文件的提交生成修补程序(例如repo1/project1/src),并忽略仅更改其他任何位置文件的所有提交 或者,为所有提交生成修补程序,但仅当修补程序更改特定目录中的文件时应用修补程序

我有两个git回购协议,它们是彼此的分支,我需要偶尔将提交从一个导入到另一个

例如:

git-repo1
具有以下目录结构:

repo1/project1/src

repo1/project2/src

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

repo2/src/

我想做的是接受一系列提交,并仅为更改了特定子目录中文件的提交生成修补程序(例如
repo1/project1/src
),并忽略仅更改其他任何位置文件的所有提交

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

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

分叉的git repo之间的目录结构不同

有没有直截了当的方法

更新1

我从处理不同目录结构的角度来看这个问题()


但是,如果补丁提到修改根本不存在的文件怎么办?我想忽略这些更改。

如果这两个存储库有共同的历史记录(它们都来自同一个存储库,但演变不同),您可以使用有选择地将提交从一个分支导入另一个分支

创建一个具有两个远程的本地存储库(两个不同的存储库)

在repositoryA中查找涉及某些文件的提交

 $ git checkout repoA/master
 $ git log sub/dir/ectory
 a34256f ...
cherry将这些承诺纳入repositoryB分支

 git checkout repoB/master
 git cherry-pick a34256f
git版本列表--反向
系列
-repo1/project1/src/\

| xargs-I@git格式修补程序--stdout@^!>mystuff.patch

将影响该子目录的一系列提交放入
mystuff.patch

那么

将除去该目录之外的所有帅哥。你可以申请

git am justmystuff.patch
根据需要使用
-p
n
--directory=new/path/to


(编辑:EOD-->\EOD,以便上面的cat不会尝试替换)

否,不幸的是,它们没有共享历史记录:(当使用命令“sed-rf mystuff.sed mystuff.patch>justmystuff.patch”时,我收到了错误“sed:invalical option--r”你知道它可能是什么吗?改用
-E
-r
现在是一种历史拼写。答案中已修复,谢谢。如果你能解释一下你的sed脚本,那就太好了!搜索并替换为你最喜欢的文本编辑器也很有效(嗯,至少对我有效)。我只是更改了路径并删除了指向子目录外文件的位。我没有触及提交哈希-我不知道上面的自动逻辑脚本是否会像@Neil那样进行更改。是否可以进行更改,允许您在其他特定文件或多个路径中保留创建和更改?例如,如果我保存一个子目录
sub-repo-a/
,外部有一个名为
.sub-repo-a.settings
的文件。我希望保留影响其中一个路径的提交。
sed -Ef mystuff.sed mystuff.patch >justmystuff.patch
git am justmystuff.patch