10.7 Git 内部原理 - 《维护与数据恢复》

维护

gc 将会做的另一件事是打包你的引用到一个单独的文件。

假设:

$ find .git/refs -type f
.git/refs/heads/experiment
.git/refs/heads/master
.git/refs/tags/v1.0
.git/refs/tags/v1.1

如果你执行了 git gc 命令,refs 目录中将不会再有这些文件。 为了保证效率 Git 会将它们移动到名为 .git/packed-refs 的文件中,就像这样:

$ cat .git/packed-refs
# pack-refs with: peeled fully-peeled
cac0cab538b970a37ea1e769cbbde608743bc96d     refs/heads/experiment
ab1afef80fac8e34258ff41fc1b867c702daa24b     refs/heads/master
cac0cab538b970a37ea1e769cbbde608743bc96d     refs/tags/v1.0
9585191f37f7b0fb9444f35a9bf50de191beadc2     refs/tags/v1.1
^1a410efbd13591db07496601ebc7a059dd55cfe9

如果你更新了引用,Git 并不会修改这个文件,而是向 refs/heads 创建一个新的文件。 为了获得指定引用的正确 SHA-1 值,Git 会首先在 refs 目录中查找指定的引用,然后再到 packed-refs 文件中查找。 所以,如果你在 refs 目录中找不到一个引用,那么它或许在 packed-refs 文件中。

注意这个文件的最后一行,它会以 ^ 开头。 这个符号表示它上一行的标签是附注标签,^ 所在的那一行是附注标签指向的那个提交。

数据恢复

主要命令 git reflog | grep 'first commit'

移除对象

Git 有很多很棒的功能,但是其中一个特性会导致问题,git clone 会下载整个项目的历史,包括每一个文件的每一个版本。
如果所有的东西都是源代码那么这很好,因为 Git 被高度优化来有效地存储这种数据。 然而,如果某个人在之前向项目添加了一个大小特别大的文件,即使你将这个文件从项目中移除了,每次克隆还是都要强制的下载这个大文件。 之所以会产生这个问题,是因为这个文件在历史中是存在的,它会永远在那里。
这个很麻烦,对一般项目实际意义不大,不记录了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • [TOC] Git 内部实现原理剖析[https://www.jianshu.com/p/8154ac47d406...
    Whyn阅读 1,033评论 2 1
  • 这篇文章本应该在6月份就完成,拖了4个月之后,终于鼓起勇气捡起来,实在惭愧。坚持写文章就像长跑,途中跑起来基本是靠...
    程序员BUG阅读 663评论 1 2
  • 一个文件来保存 SHA-1 值,而该文件有一个简单的名字, 然后用这个名字指针来替代原始的 SHA-1 值,在 G...
    金樽明月阅读 415评论 0 0
  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 3,145评论 1 4
  • Git基础 获取Git仓库的两种方式 将尚未进行版本控制的本地目录转换为Git仓库 从其他服务器==克隆==一个已...
    squarejohn_5dc8阅读 385评论 0 1

友情链接更多精彩内容