从开始动手到完工约16h
跨度4days,这几天基本上除了上课就是写这个
当然很多东西问了ai,把我的copilot额度差点干完了

开始前看完spec人都是懵的,而且英语太差很多具体意思扫一眼根本看不懂,参考了别人的persistence再仔细钻研(问ai)后脑子才慢慢有个框架。感觉最难的部分就是起步阶段,起步啥都没有,想写点什么就会发现它的依赖项还没写,去写依赖项时又发现它依赖别的,或又依赖回刚才的东西,会比较困难一点。而且debug起来比较麻烦,反正我是纯通过test结果自己找bug,找得挺痛苦的。现在回看之前所有的project都跟过家家一样,gitlet的skeleton代码简直就是一具空壳,you have to design almost everything by youself.

我的个人实现:
CS61B proj2 Gitlet

一些记录下来的bug
1
in Commit.java

1
2
3
4
5
6
7
8
9
10
11
12
13
/** Update the stage area to a new commit. */  
public void clearStage() {
Stage stg = Repository.getStage();
Set<String> removeStage = stg.getRemoveStage();
pathToBlobs = stg.getAddStage();
Map<String, String> parentMap = getParent().getPathToBlobs();
for (Map.Entry<String, String> e : parentMap.entrySet()) {
if (!removeStage.contains(e.getKey())) {
pathToBlobs.put(e.getKey(), e.getValue());
}
}
stg.clear();
}

把pathToBlobs指到了stage的addStage上,然后最后stg.clear()后啥都没了,,,

第二个bug也在上面那一段里
添加parent记录的if判断那里少了,要判断是否已经在pathToBlobs里,否则可能会覆盖了。

3

1
2
3
4
5
6
7
8
9
10
11
12
13
/** status method */  
public static void status() {
/// branches part
System.out.println("=== Branches ===");
String curHead = getCurHead();
List<String> branches = plainFilenamesIn(HEAD_DIR);
System.out.println("*" + curHead);
for (String b : branches) {
if (!b.equals(curHead)) {
System.out.println(b);
}
}
System.out.println();

Branches前面多加了一个空格,,,

4
split point算法需要考虑secondParent

5
main函数的case里忘加break; 了解了java switch case格式的穿透性

extra:
忘记编译文件,新的reset都没编译进去,跑半天Main函数那里直接跳过了怎么正确,,