gpt4 book ai didi

git - 删除 git 中的空提交

转载 作者:IT王子 更新时间:2023-10-29 01:21:55 47 4
gpt4 key购买 nike

我刚刚将一个项目从 Mercurial 迁移到 Git。当你添加标签时,Mercurial 会添加空提交,所以我最终在 Git 中得到了我想删除的空提交。

如何从 Git 中删除空提交(其中没有任何文件的提交)?

谢谢。

最佳答案

一个简单(但缓慢)的方法是使用 git filter-branch--prune-empty。在没有其他过滤器的情况下,不会更改其他提交,但会丢弃任何空提交(这将导致所有后续提交具有新的父 ID,因此仍然是“重写历史记录”:如果这是您的初始提交,则没什么大不了的从 hg 导入到 git,但如果其他人已经在使用这个存储库,那就很重要了)。

注意过滤器分支的所有常见注意事项。 (此外,作为旁注,“空提交”实际上是与前一次提交具有相同树的提交:并不是说它根本没有文件,而是它具有所有相同的文件,具有相同的模式,以及与其父提交相同的内容。这是因为 git 为每个提交存储完整的快照,而不是从一个提交到下一个提交的差异。)


这是一个小例子,它 stash 了很多你可以做更奇特的事情的地方:

$ ... create repository ...
$ cd some-tmp-dir; git clone --mirror file://path-to-original

(第一个克隆步骤是为了安全:filter-branch 可能具有相当大的破坏性,因此最好在新克隆而不是原始克隆上启动它。使用 --mirror 表示它的所有分支和标签也都反射(reflect)在这个副本中。)

$ git filter-branch --prune-empty --tag-name-filter cat -- --all

(现在可能会等待很长时间;请参阅有关加快速度的方法的文档。)

$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(此步骤是从文档中复制出来的:它丢弃了运行过滤器之前的所有原始分支。换句话说,它使过滤永久化。由于这是一个克隆,即使过滤器出错了。)

$ cd third-tmp-dir; git clone --mirror file://path-to-filtered-tmp

(这会生成过滤副本的干净、压缩良好的副本,没有过滤步骤留下的对象。)

$ git log     # and other commands to inspect

一旦您确定过滤克隆的克隆是好的,您就不需要过滤克隆,并且可以使用最后一个克隆代替第一个。 (也就是说,您可以用最终的克隆替换“真正的原始”。)

关于git - 删除 git 中的空提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28313664/

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