Git:删除推送到远程

时间:2017-12-26 15:02:41

标签: git

我当前的git日志是

enter image description here

我想丢弃Including OpenCV并删除相同的内容(因为它包含了太多不需要的库数据),我只想保留现在的内容并推送它。

当推送被拒绝时我尝试了什么:

1)Rebase导致

enter image description here

2)合并导致

enter image description here

我想要的是什么:

enter image description here

1 个答案:

答案 0 :(得分:0)

根据评论进行更新

原始回复

好的,所以遥控器有

A -- B -- C <--(master)

在本地,您将此视为

A -- B -- C <--(origin/master)

但您也有基于B

的提交
A -- B -- C <--(origin/master)
      \
       D <--(master)

现在要放弃C表示您要从C的历史记录中删除origin/master;这是一个历史重写,影响通过远程仓库共享的提交,因此您需要与repo的所有其他用户协调才能安全地执行此操作。 (如果你试图在没有这种协调的情况下做到这一点,那么可能的结果就是其他人最终会撤消你做的任何事情。)

从纯机械的角度来看,如果你说

git push -f origin master

(如果您有足够的访问权限),它会将origin/master“移动”到master,让C“无法访问”。

不会从回购中移除C。它不是真的(正如其他人在评论中所说的那样)它无法撤消 - 实际上如果回购有其他用户并且你没有与它们协调,它可能会被意外撤消。它确实将origin的每个克隆(除了你自己的)都处于需要恢复的破坏状态 - 请参阅git rebase文档中的“从上游rebase中恢复”(因为任何远程历史记录重写都是相当于这方面的上游基础)。

虽然使C无法访问已足够,除非您知道要查找它,否则您将看不到它,如果您想要实际删除C,则需要更多参与 - 特别是如果您需要它从遥控器中移除,并且不想冒险“重新出现”(这意味着你需要将它从其他人的本地仓库中移除)。除非C占用大量磁盘空间或包含敏感数据,否则最好将其保留在历史记录中,并使用新提交撤消其应用的更改(请参阅git revert

请注意,正如您在“不起作用的”两个示例中所示,合并或重新定位与您可能想要的相反;他们将不需要的提交带入您的master历史记录中。如果你采取建议还原而不是重写历史,你仍然会这样做。

更新

澄清“坏”提交带来了大量数据,似乎需要重写;但如上所述,只需重写ref,从repo中删除提交。

也就是说,将origin/master移至D并不一定能保证在Cclone或{{1}期间永远不会转移fetch (虽然你不会指望它;它取决于服务器是否尝试使用现有包文件的快捷方式)。无论如何,它不会释放原产地内的空间。

在本地仓库中,您需要做的是让pull无法访问,然后让C运行。但让gc 真正无法访问意味着不只是移动C引用(以及可能达到origin/master的任何其他引用,可能包括一些您必须知道的内容寻找),但也清除指向C的任何reflog。

幸运的是,reflogs是临时的,本地的,有点“有用的时候有用”;因此,C可能是安全的,并且可以完成此事。但是这会抛弃你当前的所有reflog,所以如果你想要更有选择性,请参阅rm -rf .git/logs文档。

然后您可以手动调用git reflog,例如

gc

希望这将在本地收回空间。

git gc --aggressive --prune=now 在远程上运行是另一回事,它取决于托管远程的方式。最坏的例子:从我检查的最后一个版本开始,TFS没有提供触发gc的方法;所以最简单的方法是将垃圾箱丢弃并重新开始。但是当然如果您只是将它托管在共享驱动器上(使用ssh或Web服务器等),那么您可以像本地存储库一样清理它。

当然,每个带有提交副本的其他本地仓库,直到该仓库被清理完毕,只需将二进制膨胀放回远程。 / p>