5

我在本地仓库中删除了一些无法访问和悬空的提交,使用

git fsck --unreachable --dangling --no-reflogs
git reflog expire --expire=now --all
git gc --prune=now

但我发现删除的提交仍然可以在源(准确地说是 GitHub)上使用。

我试过git push --force了,但它没有将更改同步到原点。如何强制将更改同步到源(也从远程删除无法访问/悬空的提交)?

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

gc prune 和 git reflog expire 的范围,以及相关配置

4

1 回答 1

7

简写

您无法指定远程如何从客户端存储其数据。

更长的形式

首先,我认为开始的地方是要了解您的本地存储库与远程存储库不同。 git fsckgit gc在本地存储库上进行操作——因为你在问这个问题,所以你已经知道了。

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

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

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

如果目标是通过压缩和删除悬空对象来减少存储库的大小,那么 GitHub 已经在做自己的事情,而您对如何完成并没有太多控制权。他们不遗余力地保持它的小巧、快速和高效。

于 2014-09-18T10:04:04.630 回答