gpt4 book ai didi

GIT:如何从初始提交中删除文件夹及其内容?

转载 作者:太空狗 更新时间:2023-10-29 14:42:48 26 4
gpt4 key购买 nike

如何从初始提交中删除文件夹及其内容?

我有一个包含多个目录的初始提交。然后很多基于它的提交。

例子:

Commit A, having the following directories & files:
A/aaa.txt
B/bbb.txt
C/ccc.txt

A - B - C - D - E - F

我想从初始提交 A 中删除目录 B 和 C。然后 - 使用 B/bbb.txt 创建 B1 分支。 - 使用 C/ccc.txt 创建 C1 分支。

所以最后树看起来像这样:

A(modified) - B1 - C1 - B - C - D - E - F

如何得到这个结果?

谢谢!

EDIT1:我只想从初始提交中删除目录。因此我认为它与另一个问题不同,而不是重复。

最佳答案

您不能修改任何 现有提交。这是一个基本的 Git 保证:任何内容一旦保存,就会永远保存,由保存时生成的哈希 ID 保存。

可以简单地停止使用任何现有的提交,当然您可以随时进行提交。因此,您需要进行一个新提交,该提交几乎与提交 A 相同,但完全不完全相同:

  • 提取现有提交 A;
  • 删除不需要的文件;
  • 最后,创建一个新的根提交 A',在大多数情况下,它是 A 的副本,除了这些文件现在已经消失的事实。

你现在有:

A--B--C--D--E--F   <-- old-master

A' <-- new-master

当然,这不是您所需要的,因为您仍然需要其他提交。所以现在您还必须将 B 复制到 B'B 和新的 B' 之间的——或者至少是 a——的区别在于 B' 的父级是 A',而不是 A。现有的 B 将现有的 A 作为其父级,您不能更改任何现有的提交

所以现在你提取 B(如果这是你的目标的一部分,可能会再次删除那些相同的文件),然后创建新的提交 B' 其父级是 A':

A--B--C--D--E--F   <-- old-master

A'-B' <-- new-master

显然,您还没有完成。您现在必须以与将 B 复制到 B' 相同的方式将 C 复制到 C',然后重复其余的提交。最终你会得到这样的结果:

A--B--C--D--E--F   <-- old-master

A'-B'-C'-D'-E'-F' <-- new-master

现在您可以使用新的提交链作为 master 并且您完成了(好吧,除了创建新的分支,这必须单独完成——您将它们绘制为B 附加到新分支中的最后一次提交,但我怀疑你并不是那个意思)。

有一个 Git 命令可以做到这一点:git filter-branchgit filter-branch 命令获取您在命令行中命名的分支,找到可从这些名称访问的每个提交(因此 F 然后是 E 然后 D 然后 ... 然后 A),将它们按正确的顺序排列(首先是 A,等等),然后开始复制:

  • 提取原始提交;
  • 按照 the documentation 中列出的顺序应用每个过滤器;
  • 创建一个新的提交,其父项是在过滤过程中之前创建的父项(或者对于原始根,进行新的根提交)。

一旦所有指定的提交都被复制,git filter-branch 调整分支名称以指向最终复制的提交。

通常,要创建整个存储库,您可以使用 --all 复制所有 提交并调整所有 分支名称,以及 --tag-name-filter cat 调整所有标签名称。您可以使用 --tree-filter,因为它是最简单的:它允许您对普通文件使用普通文件系统操作,以操纵每个提交的内容。但它也是迄今为止最慢 的过滤器;因此您可能想要进行试验,直到可以使用最快的过滤器(即 --index-filter)执行文件删除。

(您仍然需要单独构建新分支,因为 git filter-branch 仅更改任何现有 分支名称,并构建旧到的映射- 新的提交哈希值。它与 BFG 不同,它在某些方面设计得更好 - 在完成后删除此映射,但对于您的特定目的,您不需要它,你可以找到新的根提交。在存储库的克隆上进行试验是最明智的,可能是 git clone --mirror 克隆。)

关于GIT:如何从初始提交中删除文件夹及其内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48129188/

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