春の花びらが風に散る —— 楽酌の記録
编程 计算机学习

gitlet设计文档

2025年2月13日 楽酌

GitLet设计文档


Class And Data Structure


Main

读取用户输入的指令,识别指令运用对应的Repository 里的方法来实现功能

Field

暂时无变量,仅仅引用Repository里的方法实现功能


Repository

通过对应的指令类来实现各种指令的功能,将方法封装到,在Main中对于不同的指令能够直接调用的程度.

Field

  • public static final File CWD = new File(System.getProperty("user.dir")) 当前目录

  • public static final File GITLET_DIR = join(CWD, ".gitlet") 当前目录下的.gitlet 文件夹

  • public static final File STAGED_DIR = Utils.join(Repository.GITLET_DIR, "staged") .gitlet里面的staged文件夹,用于存放经过add 命令的文件,即复制的add 文件副本.

  • public static final File BLOBS_DIR = Utils.join(Repository.GITLET_DIR, "blobs") .gitlet 里面的blobs 文件夹,用于存放经过commit 命令的文件,即当前提交节点的文件。注意!该文件夹下按不同提交节点划分为多个不同子文件夹,子文件夹里面仅存放与上次提交不同的文件.

  • public static final File COMMITS_DIR = Utils.join(Repository.GITLET_DIR, "commits") .gitlet 里面的commits 文件夹,用于存放每次的提交节点的序列化文件,里面存有对于不同提交的文件的引用.


Init

初始化(创建).gitlet,staged ,blobs,commits文件夹

Field

  • public static final File GITLET_DIR .gitlet文件夹

  • public static final File STAGED_DIR staged文件夹

  • public static final File BLOBS_DIR blobs 文件夹

  • public static final File COMMITS_DIR commits 文件夹


Add

复制add [fileName] 命令中的[fileName]文件的一份副本到stagedblobs 文件夹中(注意:用CWD 文件夹的sha1码命名)

Field

  • public static final File STAGED_DIR staged文件夹,用于存储所有的add文件的副本(每次commit后会被删除)

  • public static final File BLOBS_DIR blobs文件夹,用于存储所有的add文件的用sha1码作为名称的文件副本(不会被删除)


Commit

新建一个节点,引用继承自父节点的引用,提交时,依据staged 文件夹里的文件更新/添加blobs里的引用(注意:用CWD 中与staged 中的文件相同的文件的sha1码),同时设置,HEAD 为当前节点

Field

  • private static final File COMMITS_DIR commits 文件夹

  • private static final File STAGED_DIR stahed 文件夹

  • public static Commit HEAD 当前所在的commit

  • public static Commit NEW 该分支的最新commit (没考虑到分支的情况啊)

  • private final String parent 该commit的父节点(最多2个,为了序列化用String表示)

  • private final String message 该commit的信息

  • private final String timescale 该commit的时间戳

  • private final Map blobs 该commit的保存的所有文件名称和对应引用(sha1码表示引用)`


CheckOut

依据commitIdfileName 回溯CWD中的同名文件在该分支的特定文件版本

Field

private static final File CWD 当前工作的文件夹


Log

依据HEAD 指针从后往前输出历史提交记录(log)或通过读取commits 文件夹里所有提交依次输出(global-log)

Field

  • public static Commit HEAD

Find

依据传入的String 类型的形参(message)在commits 文件夹里面查找所有信息中含有message 的提交,并将其输出

Field

  • private static final File COMMITS_DIR

Remove

Field

  • private static final File CWD

  • private static final File ADD_DIR

  • private static final File REMOVED_DIR

  • private static final File BLOBS_DIR


Reset

Field

  • private static final File CWD

  • private static final File COMMITS_DIR

  • private static final File BLOBS_DIR

  • private static final String HEAD


Status

Field

  • private static final File CWD

  • private static final File ADDED_DIR

  • private static final File REFS_DIR

  • private static final File REMOVED_DIR


Branch

Field

  • private static final File REFS_DIR

  • private static final File COMMITS_DIR

  • private static final String HEAD


Merge

Field

  • private static final File CWD

  • private static final File ADDED_DIR

  • private static final File REMOVED_DIR

  • private static final File REFS_DIR

  • private static final File BLOBS_DIR


Algorithms


Persistence

CWD <==== 当前工作的文件夹 └── .gitlet <==== 存储gitlet所有持久化数据的地方 ├── staged <==== 存储add [fileName]后文件的地方 ├── commits <==== 存储序列化后的节点的地方 └── blobs <==== 存储每一个节点实际指向的版本文件的地方

init —–初始化所有文件夹,同时提交一个默认的commit

add —–添加CWD里面的文件的副本到staged里面

commit —–序列化一个commit文件到commits里面

流程:

  • init,创建.gitlet,staged ,commits ,blobs文件夹,同时提交一个初始提交

  • add,添加对应文件到staged文件夹(原名)和blobs 文件夹(sha1名)

  • commit,复制上一个commit(仅blobs 相同),提交时更新blobs (从staged 文件夹里查询所有与bolos key相同的文件,更新其sha1码,从而可以获取到其在blobs 里的sha1码名称的文件存储)将其序列化写入用其sha1码为名的文件中存储到commits文件夹里。每次提交时更新当前分支的最新引用。(通过对比HEAD和引用的SHA1 码从而确定)

问题:如果修改了文件的名称,文件原版本和改名版本都会在中commit存在

问题:1. merge        2. status     3. short SHA1    4.global-log

Modifid:

  • 被HEAD追踪但是在CWD修改后未staged

  • 添加Staged for addition 后被在CWD删除

  • 添加Staged for addition 后被在CWD修改

  • 未删除Not staged for removal ,但被HEAD追踪且被在CWD删除

Untrucked:(忽略子文件夹)

  • 文件在CWD但是既没添加staged for addition又没被HEAD追踪

  • 文件staged for removal 被标记为删除后,未经过gitlet重新创建

← 返回文章列表