ADT*_*DTC 4 git garbage-collection git-push git-reflog
我使用以下命令删除了本地存储库中一些无法访问且悬空的提交
git fsck --unreachable --dangling --no-reflogs
git reflog expire --expire=now --all
git gc --prune=now
Run Code Online (Sandbox Code Playgroud)
但是我发现删除的提交仍然可以在原始服务器上使用(确切地说是GitHub)。
我试过了,git push --force但是它没有将更改同步到原点。如何强制将更改同步到原点(将无法访问/悬垂的提交也从远程删除)?
这是一个类似的问题,没有答案:
您无法决定远程如何从客户端存储其数据。
首先,我认为首先要了解的是本地存储库与远程存储库不同。 git fsck并git gc在您已经知道的本地存储库上运行,因为您正在询问问题。
其次,Git通过传输对象来工作。这里的窍门是,它仅讨论电线上的可到达物体。就是说,历史中必须有一条从引用(分支或标签)到对象的路径。如果所引用的对象不可访问,即使它在对象数据库中,Git也会拒绝将其传送给客户端。不利的一面是,您在本地执行的所有不涉及修改或更新引用的操作都无法在本地存储库和远程存储库之间进行通信。您不能说“将我的本地对象数据库布局同步到远程服务器”。您只能说“使本地和远程之间的可访问对象相同”。
最后,事物如何在GitHub中表示以及对象是否最终被修剪完全取决于GitHub。扎克·霍尔曼(Zach Holman)就幕后发生的事情作了演讲。我想他们会在后台运行某些操作以修剪悬空的对象,但是从远程访问的角度来看,这确实没有关系-人们无法访问未引用的对象。剩下的唯一问题是尺寸。我知道他们在进行某种修剪,因为我过去修剪过存储库并减小了它们的大小(您可以通过使用api调用查看size成员来进行检查。您可以尝试以下示例:https:/ /api.github.com/repos/jszakmeister/vimfiles)。
如果您的目标是由于签入的对象太大而缩小存储库的大小,请查看GitHub帮助部分的“ 删除敏感数据”页面。它同样适用于您要永久删除的大型文件(仅通过提交删除它们不会完全从历史记录中删除它们)。
如果目标是通过压缩和删除悬空的对象来减小存储库的大小,那么GitHub已经在做自己的事情了,您实际上并没有太多的控制权。他们竭尽全力使它体积小,速度快,效率高。
| 归档时间: |
|
| 查看次数: |
863 次 |
| 最近记录: |