gpt4 book ai didi

git - 如何将 Git 索引作为文本操作(转储和加载)?

转载 作者:太空狗 更新时间:2023-10-29 14:31:07 25 4
gpt4 key购买 nike

我发现自己需要执行复杂的 git 历史重写。具体来说,我需要删除大部分文件并扔掉一些剩余的文件。例如:

$ pr -m -t <(/bin/tree a) <(/bin/tree b)
a b
├── 5 ├── renamed-3
├── 6 └── renamed-4
└── foo
└── bar 0 directories, 2 files
├── 3
├── 4
└── baz
├── 1
└── 2

3 directories, 6 files

这可以通过 git filter-branch --tree-filter 轻松完成。然而,--tree-filter 很慢,--index-filter 的形式更快。<​​/p>

我试图用 git rm --cachedgit mv --cached 来表达我想要的操作,但结果却很丑陋。如果我可以使用标准 Unix 工具 (sed/grep/awk) 将索引的内容作为文本进行操作,那就容易多了。

是否有一对 Git 命令可以允许

  • 将 Git 索引的当前内容以一些格式的文本转储到标准输出(每行一个条目,包括文件的完整路径);
  • 将上述格式的文本从标准输入读取到 Git 索引中,完全替换其当前内容?

期望的用法示例:

git filter-branch --index-filter 'git magic-index-dump | awk "..." | git magic-index-replace'

最佳答案

使用 git ls-files --stagegit update-index --index-info 可以让你一路走下去,尽管它在某些地方有点笨拙: 删除文件意味着将其模式设置为零,重命名文件相当于在更改名称时复制该行(到指令末尾);然后在原始行中将模式设置为零。将新条目放在末尾 的意义在于,您想要的新名称可能与您计划删除的某些现有文件的名称相匹配——如果这不可能发生,则您不需要变得如此棘手。

在过滤器分支操作中,永远不应有任何正在进行的 merge ,因此在整个操作过程中,所有阶段编号都应(并保持)为零。

关于git - 如何将 Git 索引作为文本操作(转储和加载)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53721816/

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