如何仅为更改特定文件的提交生成/应用git修补程序
我有两个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-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