如何使用git筛选器分支将文件添加到特定提交?

如何使用git筛选器分支将文件添加到特定提交?,git,git-filter-branch,git-rewrite-history,Git,Git Filter Branch,Git Rewrite History,我们需要在回购协议上的特定过去提交中添加一些文件,并且我们准备重写历史记录,以便它影响到与该提交的子级不同的所有分支。我们正在尝试使用git过滤器分支,使用add,因为一旦我们将文件添加到提交中,它就不会被添加到子文件中,但是我们找不到正确的参数来阻止它影响一些并发的发散提交。请参阅图片以了解 我们使用此命令的目标是红色提交,但文件出现在紫色提交上-为什么它也出现在绿色提交上,我们不希望它影响代码路径,只出现在红色提交上,然后通过所有子提交和合并被继承 git筛选器分支-索引筛选器cp C:/U

我们需要在回购协议上的特定过去提交中添加一些文件,并且我们准备重写历史记录,以便它影响到与该提交的子级不同的所有分支。我们正在尝试使用git过滤器分支,使用add,因为一旦我们将文件添加到提交中,它就不会被添加到子文件中,但是我们找不到正确的参数来阻止它影响一些并发的发散提交。请参阅图片以了解

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

git筛选器分支-索引筛选器cp C:/Users/asdf/Documents/IdeaProj ects/git crypt tests/.gittributes.&git add.gittributes 72c7e292ddd134c04285f3530afc829fd38de4 28.头

我对坏的理解是什么

多谢各位


看起来您认为当您将提交范围写为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开头的提交之前都不需要任何内容。

这里的情况可能会比较棘手,因为要返回提交的新数据的父级实际上是合并提交,这意味着您的分支有两个可见的祖先。这可能是做一个重基的交易破坏者,过滤器分支也可能有问题。我很难理解这些参数。似乎没有很好的记录。是否有任何参考资料,以便我可以停止在so上发布基本问题?谢谢@Xelostaspena查找。我使用文本搜索变体只是因为您没有为提交显示SHA1,而且从您所指的提交图像中可以明显看出。谢谢,这非常有用。但是为什么不专注于一次提交呢?我阅读了文档并进行了尝试,为什么这个命令还会将提交添加到两个分支?这个人说这就像选择一个提交。git过滤器分支-索引过滤器cp C:/Users/asdf/Documents/IdeaProjects/git crypt tests/.gittattributes.&&git add.gittributes-HEAD 72c7e292ddd134c04285f3530afc829fd38de428^@ÁxelCostasPena A^!是A^A^1^A^2^A^3…(的缩写,即A包含在内,其所有父项均排除在外;结果是一次提交。但是当你说“B A^”的时候!,除了A之外,您还可以选择导致B的所有提交,但排除A和之前的所有父级。因此,在您的示例中,如果B是a like的后代,您将获得从a到B的所有提交(包括在内)。谢谢!它仍然让我头疼,但我刚刚发现了rev列表,所以我现在可以调试整个提交列表。