{"id":20503323,"url":"https://github.com/mrbeancpp/mit","last_synced_at":"2025-05-09T00:07:32.219Z","repository":{"id":212041923,"uuid":"730552356","full_name":"MrBeanCpp/MIT","owner":"MrBeanCpp","description":"Mini-Git in Rust. 用Rust实现的简易Git","archived":false,"fork":false,"pushed_at":"2024-08-03T09:28:28.000Z","size":362,"stargazers_count":181,"open_issues_count":2,"forks_count":12,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-09T00:07:23.455Z","etag":null,"topics":["git","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MrBeanCpp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-12T07:09:35.000Z","updated_at":"2025-04-20T15:07:21.000Z","dependencies_parsed_at":"2024-01-10T17:19:12.319Z","dependency_job_id":"ffde1123-0658-4e29-a81f-80bb8687820d","html_url":"https://github.com/MrBeanCpp/MIT","commit_stats":null,"previous_names":["mrbeancpp/git-rust","mrbeancpp/mit"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrBeanCpp%2FMIT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrBeanCpp%2FMIT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrBeanCpp%2FMIT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MrBeanCpp%2FMIT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MrBeanCpp","download_url":"https://codeload.github.com/MrBeanCpp/MIT/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253166520,"owners_count":21864482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","rust"],"created_at":"2024-11-15T19:30:13.126Z","updated_at":"2025-05-09T00:07:32.197Z","avatar_url":"https://github.com/MrBeanCpp.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n MIT: Mini-Git implementation in Rust\n\u003c/h1\u003e\n\n\u003cu\u003e中文文档\u003c/u\u003e | **[English](./README_en.md)**\n\n[项目链接](https://github.com/MrBeanCpp/MIT)\n\nGit in Rust. 用 `Rust` 实现的mini `Git`. Called `mit`.\n\n\u003e 旨在简洁易读、高效且安全\n\n\u003e 学习`Git`的最好方法就是去实现`Git`\n\u003e\n\u003e 本项目旨在提供一套 [小学二年级] 都能看懂的`Git`实现\n\u003e\n\u003e `// rm -rf 死板的设计模式 \u0026 复杂的仓库架构`\n\u003e\n**注意:** 更完善的`Git`实现，可以参考我们的另一个项目：\n[Mega-Libra](https://github.com/web3infra-foundation/mega/tree/main/libra)\n\n## 良好的跨平台支持\n\n-   [x] Windows\n-   [x] MacOS\n-   [x] Linux (Unix-like...)\n\n## 主要功能\n\n- 支持的输入路径(`pathspec`)：文件路径、目录路径（绝对或相对，包括`.` `./` `../`）\n\n\n- 支持 `mit init`, `mit add`, `mit rm`, `mit commit`\n\n    -   [x] `init`: 初始化（若仓库已存在，则不执行）- `idempotent`\n    -   [x] `add`: 将变更添加至暂存区（包括新建、修改、删除），可指定文件或目录\n        - `-A(all)` : 暂存工作区中的所有文件（从根目录开始）变更（新建√ 修改√ 删除√）\n        - `-u(update)`: 仅对暂存区[`index`]中已跟踪的文件进行操作（新建× 修改√ 删除√）\n    -   [x] `rm`: 将文件从暂存区 \u0026| 工作区移除.\n        - `--cached` : 仅从暂存区移除，取消跟踪\n        - `-r(recursive)`: 递归删除目录，删除目录时必须指定该参数\n    -   [x] `commit`\n    -   [x] `status`: 显示工作区、暂存区、`HEAD` 的状态，（只包含当前目录）；分为三部分：\n        - **Staged to be committed:** 暂存区与`HEAD`(最后一次`Commit::Tree`)比较，即上次的暂存区\n        - **Unstaged:** 暂存区与工作区比较，未暂存的工作区变更\n        - **Untracked:** 暂存区与工作区比较，从未暂存过的文件（即未跟踪的文件）\n    -   [x] `log`\n\n- 支持分支 `mit branch`, `mit switch`, `mit restore`\n\n    -   [x] `branch`\n    -   [x] `switch`\n        与 `checkout` 不同，`switch` 需要指明`--detach`，才能切换到一个`commit`，否则只能切换分支。\n        同时为里简化实现，有任何未提交的修改，都不能切换分支。\n    -   [x] `restore`: 回滚文件\n        - 将指定路径（可包含目录）的文件恢复到`--source` 指定的版本，可指定操作暂存区 \u0026| 工作区\n            - `--source`：可指定`Commit Hash` `HEAD` `Branch Name`\n        - 若不指定`--source`，且无`--staged`，则恢复到`HEAD`版本，否则从暂存区[`index`]恢复\n        - 若`--staged`和`--worktree`均未指定，则默认恢复到`--worktree`\n        - 对于`--source`中不存在的文件，若已跟踪，则删除；否则忽略\n\n- 支持简单的合并 `mit merge` (fast-forward)\n-\n    -   [x] Merge(FF)\n\n## 备注\n\n### ⚠️测试需要单线程\n\n⚠️注意：为了避免冲突，执行测试时请加上`--test-threads=1`\n\n如：`cargo test -- --test-threads=1`\n\n因为测试需要对同一个文件夹进行IO\n\n### 名词释义\n\n- 暂存区：`index` or `stage`，保存下一次`commit`需要的的文件快照\n- 工作区：`worktree`，用户直接操作的文件夹\n- 工作目录：`working directory` or `repository`，代码仓库的根目录，即`.mit`所在的目录\n- `HEAD`：指向当前`commit`的指针\n- 已跟踪：`tracked`，指已经在暂存区[`index`]中的文件（即曾经`add`过的文件）\n\n### 介绍视频\n\n[【Mit】Rust实现的迷你Git - 系统软件开发实践 结课报告_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1p64y1E78W/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrbeancpp%2Fmit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrbeancpp%2Fmit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrbeancpp%2Fmit/lists"}