【问题标题】:git: change a commit and delete the old onegit:更改提交并删除旧的
【发布时间】:2022-01-03 19:07:28
【问题描述】:

我想修改当前的 git commit 并删除它以前的形式。换句话说,“旧”当前提交必须消失,并被具有相同提交消息的“新”提交所取代。

目前我正在做:

git add .
git commit --amend --no-edit
git push --force

从网络界面(gitlab)或使用git log,我只能看到“新”当前提交;但如果我搜索“旧”当前提交哈希(网络界面或.git),我仍然能够看到“旧”提交内容。

有没有办法完全删除旧的“当前”提交?

谢谢

更新

遵循我尝试过的一些建议:

git add .
git commit --amend --no-edit
git stash clear
git fsck --unreachable --no-reflogs
git reflog expire --expire-unreachable=now --all
git gc --prune=now
git repack
git push --force

虽然在本地我可以看到提交不再存在 (git branch -a --contains <commit_id>),但 gitlab 上的存储库大小继续增加,即使我触发了内务处理。

【问题讨论】:

    标签: git gitlab git-commit git-revert git-amend


    【解决方案1】:

    有没有办法完全删除旧的“当前”提交

    不是真的。没有名称(例如分支或标签)指向的提交,并且无法从名称指向的任何提交中访问,最终将被清理;你可以强制它在你的机器上过早地发生。但在 GitLab 上,它需要网站所有者的人工干预才能提前实现。 (尽管您可以通过内务处理来实现它;请参阅How can I force GitLab to carry out a garbage collection (and permanently remove a file)

    因此,此时原始(“旧”当前提交)预定进行销毁,但尚未销毁。这不是错误,而是一项功能。

    【讨论】:

    • 感谢您的回复。我如何至少在本地删除它?我已经尝试过git gc; git repack,但我仍然可以在.git 中找到对象。
    • 提交被保留,因为它出现在 reflog 中。您必须 gc 告诉 git 忽略 reflog stackoverflow.com/a/14728706/717372 但大多数时候,您不关心修改后的提交(因此您不必费心执行 gc),除非您已提交一些安全信息。如果你已经推送了它,你应该认为它可能被泄露并绝对改变它......
    • 我已经尝试了您的一些建议(请参阅更新后的帖子),但远程(gitlab)没有改变。
    • 是的,我不是 GitLab 专家,这就是为什么我说“你可能……”。 :(
    猜你喜欢
    • 2018-10-18
    • 2023-02-08
    • 2014-07-12
    • 1970-01-01
    • 2011-12-19
    • 2013-10-16
    • 2018-12-30
    • 2021-02-06
    • 2020-07-30
    相关资源
    最近更新 更多