完全删除git数据库的提交

我需要一个提交不再在提交的git数据库中。 我需要能够删除提交abc123...这样的git checkout abc123...返回error: pathspec 'abc123...' did not match any file(s) known to git.

质量保证如何删除'git commit'部分地回答了这个问题,就像如何从HEAD中删除对提交的引用一样,但不包括查找提交所存在的所有分支,也不包括过期和清除该提交一旦做出悬而未决的提交。

我将如何实现这一目标?


  • 列出包含提交的所有分支:

    git branch --contains COMMITSHA
    
  • 从这些分支中删除提交:

    git checkout BRANCH
    git rebase -i COMMITSHA^
    # delete line with commit and save
    

    如果在任何遥控器中跟踪更改的分支,请使用覆盖将其推入:

    git push --force REMOTE BRANCH
    

    例如:

    git push --force origin master
    

    (请注意,根据您的开发流程,提交也可能出现在未跟踪的远程分支中。)

  • 清除提交,因此无法从您的本地回购中恢复:

    git reflog expire --all BRANCH1 BRANCH2 # list all branches you changed
    git prune --expire now
    

    请注意,您还必须在具有此提交的所有远程存储库上运行此命令。 如果你没有权限访问远程仓库,你必须跨越你的手指 - commit本身最终会过期,并会被git gc清除。

    需要警告的是,上述命令将从Git仓库中删除所有悬挂对象以及所有分支更改的历史记录 - 因此您无法在其运行之前(通过非法庭手段)恢复任何丢失的内容。

  • 告诉所有合作者获取更改的分支并根据他们更新他们可能拥有的任何工作。 他们应该这样做:

    git fetch REMOTE      
    

    对于基于您在上面更改的分支的每个分支(包括分支本身(如果他们具有本地):

    git checkout BRANCH
    git rebase REMOTE/BRANCH
    git reflog expire --all BRANCH
    

    完成后:

    git prune --expire now
    

  • 确保没有裁判需要提交(重置为之前,或重新分配)
  • .git/objects删除.git/objects (它将位于以散列的前两个字符命名的文件夹中,文件名将是散列的其余部分)。
  • 但是,请注意,如果您将此提交推送到公共存储库,则将其从本地删除将不会将其从远程删除。

    链接地址: http://www.djcxy.com/p/8995.html

    上一篇: Completely remove commit from git database

    下一篇: Delete a commit from github