gpt4 book ai didi

git - 对特定提交使用 git filter-branch

转载 作者:行者123 更新时间:2023-12-03 16:40:32 24 4
gpt4 key购买 nike

我正在尝试使用 git filter-branch删除最近更新和提交的文件的功能。我尝试运行以下命令:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch myfile' --prune-empty --tag-name-filter cat -- 6f7fda9..HEAD

但是,这只会从主分支中删除文件,我希望将其从所有分支中删除。

从提交 6f7fda9 开始至 HEAD我想删除文件。我运行的命令是错误的吗?

最佳答案

您所说的要求是矛盾的。具体来说

I want it removed from all branches.





Starting with commit 6f7fda9 to HEAD I want the file removed.



需要调和。我怀疑这归结为对提交范围的不准确理解——这在 git 中只是一种东西。

考虑这个提交图:
x -- 6f7fda9 -- A -- B -- C -- F <--(master)
\ ^(HEAD)
D -- E <--(branch)

所以 HEADmaster这是在 F ;并且有一个分支(显然)是从 A 创建的(在 6f7fda9 之后但在 HEAD 之前)。

现在的问题是,给定这张图 6f7fda9..HEAD意思?不幸的是,答案并不是很多人直觉上的想法。
6f7fda9..HEAD HEAD ^6f7fda9的缩写- 意思是“从 HEAD 可以到达的所有东西,但不能从 6f7fda9 到达”。 “可达”意味着“提交本身,以及您通过遵循父指针找到的任何提交”。所以在这种情况下,它意味着 A , B , C , 和 F ;但不是 x6f7fda9 (因为它们可以从 6f7fda9 到达),也不是 D , 或 E (因为它们无法从 HEAD 访问)。

获取方式有多种 filter-branch处理所有分支。例如你可以
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch myfile' --prune-empty --tag-name-filter cat -- --all

但这将包括所有引用(不仅仅是所有分支);如果这是个问题
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch myfile' --prune-empty --tag-name-filter cat -- --branches

另一个警告 - 如果您特别不想在 6f7fda9 之前提交重写,那么您需要包含一个或多个负面提交引用。但假设您确实打算包含 6f7fda9本身,你会排除它的父级(不是它本身)。
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch myfile' --prune-empty --tag-name-filter cat -- ^6f7fda9^ --branches

6f7fda9是一个 merge ,您必须列出其每个父项的负面提交引用。

关于git - 对特定提交使用 git filter-branch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51772096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com