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_DIRstaged文件夹public static final File BLOBS_DIRblobs文件夹public static final File COMMITS_DIRcommits文件夹
Add
复制add [fileName] 命令中的[fileName]文件的一份副本到staged和blobs 文件夹中(注意:用CWD 文件夹的sha1码命名)
Field
public static final File STAGED_DIRstaged文件夹,用于存储所有的add文件的副本(每次commit后会被删除)public static final File BLOBS_DIRblobs文件夹,用于存储所有的add文件的用sha1码作为名称的文件副本(不会被删除)
Commit
新建一个节点,引用继承自父节点的引用,提交时,依据staged 文件夹里的文件更新/添加blobs里的引用(注意:用CWD 中与staged 中的文件相同的文件的sha1码),同时设置,HEAD 为当前节点
Field
private static final File COMMITS_DIRcommits文件夹private static final File STAGED_DIRstahed文件夹public static Commit HEAD当前所在的commitpublic static Commit NEW该分支的最新commit (没考虑到分支的情况啊)private final String parent该commit的父节点(最多2个,为了序列化用String表示)private final String message该commit的信息private final String timescale该commit的时间戳private final Map<String,String> blobs该commit的保存的所有文件名称和对应引用(sha1码表示引用)`
CheckOut
依据commitId ,fileName 回溯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 CWDprivate static final File ADD_DIRprivate static final File REMOVED_DIRprivate static final File BLOBS_DIR
Reset
Field
private static final File CWDprivate static final File COMMITS_DIRprivate static final File BLOBS_DIRprivate static final String HEAD
Status
Field
private static final File CWDprivate static final File ADDED_DIRprivate static final File REFS_DIRprivate static final File REMOVED_DIR
Branch
Field
private static final File REFS_DIRprivate static final File COMMITS_DIRprivate static final String HEAD
Merge
Field
private static final File CWDprivate static final File ADDED_DIRprivate static final File REMOVED_DIRprivate static final File REFS_DIRprivate 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文件夹里查询所有与boloskey相同的文件,更新其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重新创建