如何使用 git filter-branch 将文件添加到特定提交?

How to add a file to a specific commit with git filter-branch?

我们需要在回购的特定过去提交中添加一些文件,我们准备重写历史,以便它影响从该提交的子分支中分离出来的所有分支。我们正在尝试为此使用 git filter-branch,使用 add,因为一旦我们将文件添加到提交中,它就不会添加到子项中,但是我们找不到正确的参数来停止它影响一些并发的发散提交。看图理解。

我们正在使用此命令针对红色提交,但该文件出现在紫色提交上 - 为什么? - 它也出现在绿色提交上,我们不希望它影响代码路径,只出现在红色提交上,然后通过所有子提交和合并继承。

git filter-branch --index-filter "cp C:/Users/asdf/Documents/IdeaProj ects/git-crypt-tests/.gitattributes . && git add .gitattributes" 72c7e292ddd134c04285f3530afc829fd38de4 28..HEAD

我理解错了什么?

谢谢。

您似乎认为,当您将提交范围写为 A..B 时,它会包含边界。但事实并非如此。此符号是 B ^A 的缩写,即 B 之前的所有内容,但不包括 A 之前的所有内容。这将从范围中删除 "lower" 绑定 A。解决办法就是你写A~,意思是"the ancestor of A":A~..B.

此外,由于您确切地知道要将文件添加到哪些提交以及不想添加它们,您可以限制修订 walker 仅列出想要的提交:

git filter-branch --index-filter "cp C:/Users/asdf/Documents/IdeaProjects/git-crypt-tests/.gitattributes . && git add .gitattributes" -- HEAD --not 72c7e29~ ":/Fix Prestapp"

也就是说,你说你想要所有提交到 HEAD,但在 72c7e29~ 之前和消息以 Fix Prestapp.[=22= 开头的提交之前都没有]