【问题标题】:git - Completely remove commits from an unrelated remote that was added accidentallygit - 从意外添加的不相关远程完全删除提交
【发布时间】:2015-05-13 09:29:45
【问题描述】:

我手头有一个有趣的问题。在共享团队存储库中,团队成员将远程添加到完全不相关的存储库(这是一个意外)。

例如

git remote add foreign-remote https://github.com/some-open-source-project

他签出那个 repo 的 master 分支并将其推送到我们的 repo。

例如

git checkout foreign-remote/master
git checkout -b experiment
git push origin experiment

这实际上在团队 repo 中创建了两个不相关的子图:

左边部分是我们的正确代码,右边部分是外部存储库。

我们如何才能完全删除正确的部分?它不会造成任何伤害,但很烦人,我想摆脱这个子图,最好不要留下任何痕迹。

另外,有没有办法防止这种情况发生?

【问题讨论】:

    标签: git


    【解决方案1】:

    从遥控器中删除指向错误图形的分支。在您的情况下,它是experiment

    git push origin :experiment
    

    如果其他开发人员已经获取了该分支,他们必须执行一个

    git fetch --prune
    

    更详细的

         A                         F
        /|\                        |
       B C D                       G
        \|/                        |
         E <-- origin/master       H <--- origin/experiment
    

    现在,如果您从 origin 中删除 experiment 分支,则提交 H 将不再被引用。因此,F-G-H 的提交将在 git gc 上被删除。

    从遥控器中删除后。已经获取它的开发者必须通过git fetch --prune 删除不再存在的遥控器。

    如果您想感觉更安全,请进行备份克隆

    另外,有没有办法防止这种情况发生?

    使用 gerrit 代码审查。它允许您定义细粒度的访问权限,并且您可以在审核时拒绝变更集。因此,错误的提交将被丢弃,并且不会集成到您的存储库中。

    【讨论】:

    • 谢谢,这绝对为我指明了正确的方向。我删除了分支和标签。然后我还必须查看 reflog,我发现了一些有用的命令来验证它是否正常工作: git fsck --unreachable --no-reflogs 会告诉我所有无法访问的提交 git gc --prune=now 会杀死它们并再次运行 fsck 命令验证没有任何东西无法访问:-)
    • 在这里也找到了一些有用的信息stackoverflow.com/questions/3765234/…
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 2017-01-19
    • 2013-03-26
    • 2020-01-23
    • 2016-12-05
    • 2012-07-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多