# Java项目29组 **Repository Path**: pkurw-java-course-project/java-project-29-group ## Basic Information - **Project Name**: Java项目29组 - **Description**: No description available - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-29 - **Last Updated**: 2022-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SimpleGit Build your own Git with Java ##29组项目成员及分工 曹蕾:blob、tree类部分方法的实现,第一次汇报 刘荔婧:repo类和测试用例的实现,两次汇报的演示文稿 郑茂森:所有其他代码以及框架,及第二次汇报 ##完成情况 由于本组中两位成员都是零基础加上时间十分紧急,进度并不理想,目前只实现了add、commit、log、rm、reset、branch、checkout这些基础功能,diff、merge等功能还有待完善。 ## 功能 1. 在当前目录初始化jit仓库/或者指定目录初始化: ``` java Jit.main init(path) ``` 2. 跟踪或者暂存最新版文件,支持暂存文件夹操作 ``` java Jit.main add [filename] ``` 3. 添加分支 ``` java Jit.main branch [branch_name] ``` 4. 检出到指定分支 ``` java Jit.main checkout [branch_name] ``` 5. 提交暂存区 ``` java Jit.main commit [log_text] ``` 6. 按照时间逆序打印当前分支的所有历史提交记录,直到第一次提交 ``` java Jit.main log ``` 7. 检出到指定提交 ``` java Jit.main reset [commit_id] ``` 8. 将指定文件从暂存区删除,同时也在磁盘上删除该文件 ``` java Jit.main rm [filename] ``` ##实现思路及原理 - jit是主类,包含主要操作解析和逻辑以及stage、head、branch和repo的静态单例,通过操作stage和gitObject对象完成命令。 - 暂存区就是stage,trackedfile跟踪了所有已提交的文件,数据结构是将文件路径映射到文件的hash的Map。trackedir是已跟踪文件夹的集合。uncommittedfile是所有已跟踪,修改后又被add的文件字典。newfile是新加入文件字典。removefile则是被rm提交的文件记录。 - tree实现了文件夹结构的存储,包含了对应目录下文件路径和hash值的键值对。 - blob存储了文件的内容,blob名则是对文件的hash - commit是一次全局快照,包含了本次快照的时间戳、父快照ID、提交信息以及本次快照对应的文件树Tree对象。 - head保存了目前所在commit链位置,以及当前分支名称。branch则存储了分支信息,也就是分支名和头commitID。 - Util重写了所有用到的工具方法 ##亮点 对所有操作都实现了对文件夹的支持,大量使用递归实现了add子文件夹,rm子文件夹的支持。(如果只操作一级文件目录会比目前容易很多)通过动态调整,保证一次提交只产生一个版本的文件树,保证文件冗余较低。 ##不足与反思 - 前期对项目复杂性认识不足,对于理念理解不够充分,做了很多无用功后又推倒重做以支持深度文件夹的操作。浪费了很多时间。 - 由于时间紧张,异常信息并没能统一,各处的处理比较随意。也没有提供完整的注释。 - 大量使用递归搜索文件树导致时间复杂度偏高,现在想可以通过文件路径解析逐层寻找降低时间复杂度。同时commit命令动态调整时也可以通过多次调整一次存储而非存储删除的方式,这些问题后期我再调整调整。 - merge、diff方法没能实现,不过目前的数据结构可以支持实现这两个命令,留待以后我自己再做。 ## 参考文献 1. [CS61B-Project3-Gitlet](https://inst.eecs.berkeley.edu/~cs61b/fa19/materials/proj/proj3/index.html) 2. [Pro Git 2nd](https://git-scm.com/book/en/v2) *郑茂森 2022.1*