gpt4 book ai didi

git filter-branch : filter directories by excluding, 不包括?

转载 作者:行者123 更新时间:2023-12-04 13:18:26 26 4
gpt4 key购买 nike

假设我在 repo 中有这个结构:

repo/
dir1/
dir2/
dir3/
dir4/
dir5/
...

现在我想保留所有目录,除了 dir1dir2 .

我可以使用这个命令来保留指定的目录。
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- dir3 dir4 dir5 ... dirN' --prune-empty -- --all

现在如果我有很多目录,排除我不需要的目录而不是指定我需要的目录会更简单。我怎么能那样做?

最佳答案

更改您的 index-filter专门删除不需要的路径,而不对任何其他路径执行任何操作,即 --index-filter部分变为:

--index-filter 'git rm --cached -qr --ignore-unmatch dir1 dir2'

您现在使用的索引过滤器由两个单独的命令组成,这些命令由 && 连接起来。 .这些命令是文本形式的:
  • 删除一切。 (--ignore-unmatch 在这里毫无意义,因为您使用 . 来指定“存在的一切”,而“存在的一切”显然都存在。)
  • 然后,放回 dir3 , dir4等,来自当前提交。

  • 由于您只想删除(递归地)“ dir1 中的所有内容”和“ dir2 中的所有内容”,请指定它们。保留 --ignore-unmatch如果可能存在没有 dir1 的提交和/或 dir2文件存在。删除你想要的东西后,你不需要放回任何东西:索引——临时索引 git filter-branch用于实现过滤(见下文) - 现在其中包含正确的文件集。

    侧边栏:无论如何,这个索引是什么?

    当您进行新的提交时,Git 实际上不会使用您工作树中的文件。他们在这里并不重要。

    相反,Git 有一个东西——主要实现为一个名为 .git/index 的文件。 ,真的——Git 以各种方式调用索引、暂存区或(现在很少)缓存。该索引最初保存从当前提交中取出的每个文件的副本。然后您可以使用 git addgit rm更新索引中的文件,或将文件完全从索引中取出。

    您可以将索引视为建议的下一次提交。当您运行时 git commit ,Git 将此时索引中的文件打包,并将它们卡住到一个新的、永久的、1 只读提交中。您在工作树中看到和使用的文件只为您提供,而不是真正为 Git 提供的。这就是为什么,每当您修改工作树文件并希望更改进入下一次提交时,您必须 git add一直以来: git add告诉 Git 获取工作树副本并用它覆盖索引副本,以便 下一个 提交将有这个版本。

    当您使用 git filter-branch ,你有很多选择。最慢的一个, --tree-filter , 获取每个提交,将其复制到一个临时索引中——因为 Git 总是需要一个索引来处理这些内容,即使它不是常规的主索引——然后从该临时索引中提取所有文件到一个临时树中。然后您可以使用您的 --tree-filter 修改临时树中的文件。代码。 Git 然后重新读取临时树,从中构建一个新的(但仍然是临时的)索引,并使用它来进行新的提交。

    所有这些复制都非常缓慢。所以 filter-branch 给你 --index-filter : 这一次,Git 将提交复制到一个临时索引,然后让您直接修改临时索引。 git rm --cached命令通过从中删除文件来修改索引——或者在这种情况下,修改临时索引。然后 filter-branch 从临时索引进行新的提交。这会跳过 --tree-filter 中最慢的部分.

    您仍然会将存储库中的每个提交复制到一些新的和改进的提交中,但是通过仅在 filter-branch 提供的临时索引中执行此操作,速度会快得多。

    1提交实际上只是半永久性的。只要 Git 可以找到它们,它们就会一直存在。有关更多信息,请参阅 Think Like (a) Git .当您使用 filter-branch 时,您将一些提交复制到一些新的和改进的提交中,并让您的 Git 尝试忘记原始提交。最终,您的 Git 可能会忘记它们。

    关于git filter-branch : filter directories by excluding, 不包括?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57431607/

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