Git 在reflog过期和gc删减后推送到源站

Git 在reflog过期和gc删减后推送到源站,git,garbage-collection,git-push,git-reflog,Git,Garbage Collection,Git Push,Git Reflog,我使用 git fsck --unreachable --dangling --no-reflogs git reflog expire --expire=now --all git gc --prune=now 但是我发现删除的提交仍然可以在源(确切地说是GitHub)上使用 我尝试了git push--force,但它没有同步对origin的更改。如何强制将更改同步到源(是否也从远程删除了不可访问/挂起的提交) 这是一个没有答案的类似问题: 缩略形式 您不能指定远程设备如何存储来自客户端

我使用

git fsck --unreachable --dangling --no-reflogs
git reflog expire --expire=now --all
git gc --prune=now
但是我发现删除的提交仍然可以在源(确切地说是GitHub)上使用

我尝试了git push--force,但它没有同步对origin的更改。如何强制将更改同步到源(是否也从远程删除了不可访问/挂起的提交)

这是一个没有答案的类似问题:

缩略形式 您不能指定远程设备如何存储来自客户端的数据

长形 首先,我认为首先要了解您的本地存储库与远程存储库不同
git fsck
git gc
在本地存储库上运行——您已经知道了,因为您正在问这个问题

其次,Git通过传输对象来工作。这里的诀窍是,它只讨论通过导线可以到达的对象。也就是说,从引用(分支或标记)到历史中的对象必须有一条路径。如果引用的对象不可访问,Git将拒绝将其传输到客户端,即使它位于对象数据库中。另一方面,您在本地执行的任何不涉及修改或更新引用的操作都无法在本地和远程存储库之间进行通信。不能说“将本地对象数据库布局同步到远程”。您只能说“使本地和远程对象之间的可访问对象相同。”

最后,如何在GitHub中表示事物,以及是否最终修剪对象,完全取决于GitHub。扎克·霍尔曼讲述了一些幕后发生的事情。我想象他们在后台运行一些东西来在某个点上修剪悬垂的对象,但是从远程访问的角度来看,这真的不重要——人们无法访问未引用的对象。剩下的唯一问题是尺寸。我知道他们正在进行某种修剪,因为我过去修剪过存储库并减小了它们的大小(您可以通过使用api调用查看大小成员来检查这一点。您可以尝试以下示例:)

如果您的目标是缩小存储库大小,因为签入的对象太大,请查看GitHub帮助部分的页面。它同样适用于要永久删除的大型文件(仅通过提交将其删除并不完全从历史记录中删除)


如果目标是通过压缩和删除悬空对象来减少存储库的大小,那么GitHub已经在做自己的事情了,而您实际上无法控制如何做。尽管如此,他们还是竭尽全力保持它的小型、快速和高效。

这里的信息很棒。总而言之,我无法强制删除远程中悬空的提交。无论如何,我联系了GitHub支持人员,他们友好地运行了一个
gc
来删除它们。如果需要在远程上删除提交,我想这就是裸回购维护人员在接到请求时需要做的事情。