首页 > 解决方案 > 如何使用 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

我怎么理解不好?

谢谢你。

在此处输入图像描述

标签: gitgit-filter-branchgit-rewrite-history

解决方案


看起来您认为当您编写提交范围时A..B,它将包括边界。但事实并非如此。这种表示法是 的缩写B ^A,即直到 的所有内容B,但不包括直到 的所有内容A。这从范围中删除了“下限” A。解决方案是你写A~,意思是“的祖先A”:A~..B

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

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


推荐阅读