我使用
在我的本地仓库中删除了一些无法访问和悬空的提交git fsck --unreachable --dangling --no-reflogs
git reflog expire --expire=now --all
git gc --prune=now
但是我发现删除的提交仍然可以在原点上使用(确切地说是GitHub)。
我尝试了git push --force
,但它没有将更改同步到原点。如何强制将更改同步到原点(同时从远程删除无法访问/悬空提交)?
这是一个类似的问题,没有答案:
答案 0 :(得分:4)
您无法决定遥控器如何从客户端存储数据。
首先,我认为开始的地方是要了解您的本地存储库与远程存储库不同。 git fsck
和git gc
在您已经知道的本地存储库上运行,因为您提出了问题。
其次,Git通过传输对象来工作。这里的诀窍是它只讨论通过线路可达到的对象。意思是,必须有一条从引用(分支或标记)到历史中对象的路径。如果无法访问被引用的对象,Git将拒绝将其传输到客户端,即使它在对象数据库中也是如此。另一方面,您在本地执行的任何不涉及修改或更新引用的内容都无法在本地和远程存储库之间进行通信。您不能说"将我的本地对象数据库布局同步到远程"。你只能说"使本地和远程之间的可达对象相同。"
最后,如何在GitHub中表示事物,以及对象是否最终被修剪,完全取决于GitHub。扎克霍尔曼has given a talk关于幕后发生的一些事情。我想他们在后台运行一些东西来修剪悬挂的物体,但从远程访问的角度来看,它确实无关紧要 - 人们无法访问未引用的对象。剩下的唯一问题是尺寸。我知道他们正在进行某种修剪,因为我过去修剪了存储库并减小了它们的大小(你可以通过使用api调用查看size成员来检查这个。你可以试试这个作为一个例子:https://api.github.com/repos/jszakmeister/vimfiles)。
如果您的目标是缩小存储库大小,因为您签入了太大的对象,请查看GitHub帮助部分中的Removing sensitive data页面。它同样适用于您要永久删除的大型文件(只需通过提交删除它们并不完全从历史记录中删除它们。)
如果目标是通过压缩和删除悬空对象来减少存储库大小,GitHub已经在做自己的事情了,而且你并没有真正控制它的完成方式。他们竭尽全力保持小巧,快捷,高效。