我使用在本地回购中删除了一些无法访问和悬挂的提交
git fsck --unreachable --dangling --no-reflogs
git reflog expire --expire=now --all
git gc --prune=now
但我发现删除的提交在源代码(确切地说是GitHub)上仍然可用。
我尝试了git push --force
,但它没有将更改同步到原点。如何强制将更改同步到原点(同时从远程删除无法访问/悬挂的提交)?
这是一个没有答案的类似问题:
gc prune和git reflog的范围过期,以及相关的配置
缩写
您不能指定远程设备如何从客户端存储数据。
较长的形式
首先,我认为首先要了解本地存储库与远程存储库不同。git fsck
和git gc
在本地存储库上运行——您已经知道了,因为您在问这个问题。
其次,Git通过传输对象来工作。这里的诀窍是,它只谈论通过电线可以到达的对象。也就是说,历史中一定有一条从引用(分支或标记)到对象的路径。如果引用的对象不可访问,Git将拒绝将其传输到客户端,即使它在对象数据库中也是如此。另一方面,您在本地所做的任何不涉及修改或更新引用的事情都无法在本地和远程存储库之间进行通信。你不能说"将我的本地对象数据库布局同步到远程"。你只能说"使我的本地和远程之间的可访问对象相同。"
最后,如何在GitHub中表示事物,以及对象最终是否被修剪,完全取决于GitHub。Zach Holman就幕后发生的一些事情发表了演讲。我想他们会在后台运行一些东西,在某个时刻修剪悬挂的对象,但从远程访问的角度来看,这真的无关紧要——人们无法访问未引用的对象。剩下的唯一问题是尺寸。我知道他们正在进行某种修剪,因为我过去修剪过存储库,并减少了它们的大小(你可以通过使用api调用查看大小成员来检查这一点。你可以尝试以下示例:https://api.github.com/repos/jszakmeister/vimfiles)。
如果您的目标是因为签入的对象太大而缩小存储库大小,请参阅GitHub帮助中的"删除敏感数据"页面。它同样适用于您想要永久删除的大文件(简单地通过提交删除它们并不能完全从历史记录中删除它们)。
如果目标是通过压缩和删除悬挂对象来减少存储库的大小,那么GitHub已经在做自己的事情了,而你实际上对如何做到这一点没有太多控制权。尽管如此,他们还是不遗余力地保持它的小、快、高效。