|
2 | 2 |
|
3 | 3 | > Git의 내부 구조를 직접 구현해보는 CLI 기반 학습 프로젝트입니다. |
4 | 4 |
|
5 | | -`add`, `commit`, `log`, `branch`, `checkout` 등 |
6 | | -Git의 핵심 동작을 JavaScript로 재구현하면서 |
7 | | -*버전 관리 시스템의 원리*를 몸으로 이해하는 것을 목표로 합니다. |
| 5 | +Git의 내부 동작 원리를 학습하며 구현한 Git 클론 프로젝트입니다. |
| 6 | +Git 객체(`blob`, `tree`, `commit`) 생성과 참조 과정을 직접 구현해보며 구조를 체화했습니다. |
8 | 7 |
|
9 | | ---- |
| 8 | +# 시연 데모 |
10 | 9 |
|
11 | | -## 📌 프로젝트 목표 |
| 10 | + |
12 | 11 |
|
13 | | -- Git의 **snapshot 기반 저장 구조** 체득 |
14 | | -- `blob`, `tree`, `commit`, `HEAD` 등 Git 객체 구조 직접 구현 |
15 | | -- CLI 명령어 흐름(`git add`, `git commit`, `git log`)을 JavaScript로 재현 |
16 | | -- 구조 설계를 통해 **자료구조, 파일시스템, OOP 감각** 강화 |
| 12 | +```plaintext |
| 13 | +Working Dir → add() → Blob (해시) |
| 14 | + ↓ |
| 15 | + Index (스테이징) |
| 16 | + ↓ |
| 17 | + commit() → Tree → Commit |
| 18 | + ↑ |
| 19 | + HEAD → Branch (refs/heads/main) |
| 20 | +``` |
| 21 | + |
| 22 | +## 구현 기능 |
| 23 | + |
| 24 | +| 명령어 | 설명 | |
| 25 | +| ---------- | --------------------------------------------- | |
| 26 | +| `init` | 저장소 초기화 | |
| 27 | +| `add` | 파일을 `Blob` 객체로 저장 후 `index` 기록 | |
| 28 | +| `commit` | `Tree`, `Commit` 객체 생성 및 `HEAD` 업데이트 | |
| 29 | +| `branch` | 새로운 브랜치 생성 | |
| 30 | +| `checkout` | 브랜치 전환 | |
| 31 | +| `log` | 커밋 로그 출력 | |
17 | 32 |
|
18 | | -## ⚙️ 사용 기술 |
| 33 | +## 설치 및 사용 |
| 34 | + |
| 35 | +```bash |
| 36 | +npm install |
19 | 37 |
|
20 | | -| 분류 | 기술 | |
21 | | -| ----------- | ------------------------------------------- | |
22 | | -| 언어 | JavaScript (Node.js) | |
23 | | -| 파일 I/O | `fs` 모듈 | |
24 | | -| CLI 처리 | `process.argv`, `readline` | |
25 | | -| 데이터 저장 | JSON 기반 `.mygit/` 디렉토리 내부 객체 구조 | |
| 38 | +# 일반 실행 |
| 39 | +node src/index.js init |
| 40 | +node src/index.js add hello.txt |
| 41 | +node src/index.js commit "first commit" |
26 | 42 |
|
27 | | -## 주요 기능 |
| 43 | +# 또는 CLI 명령어로 등록 (1회 실행) |
| 44 | +npm link |
28 | 45 |
|
29 | | -| 명령어 | 설명 | |
30 | | -| ---------- | ------------------------------------------------- | |
31 | | -| `init` | `.mygit/` 폴더 생성 및 초기 구조 설정 | |
32 | | -| `add` | - 파일을 읽고 해시(blob)로 저장<br>- index에 등록 | |
33 | | -| `commit` | snapshot 저장, 이전 커밋과 연결 | |
34 | | -| `log` | HEAD에서 커밋 히스토리 추적 및 출력 | |
35 | | -| `branch` | 브랜치 포인터 생성 | |
36 | | -| `checkout` | HEAD 포인터 전환 및 상태 변경 | |
| 46 | +# 이후부터 |
| 47 | +mini-git init |
| 48 | +mini-git add hello.txt |
| 49 | +mini-git commit "first commit" |
37 | 50 |
|
38 | | ---- |
| 51 | +``` |
39 | 52 |
|
40 | | -## 🧱 디렉토리 구조 |
| 53 | +## 디렉토리 구조 |
41 | 54 |
|
42 | 55 | ```bash |
43 | | -mini-git/ |
44 | | -├── src/ |
45 | | -│ ├── commands/ # CLI 명령어 처리 로직 (init, add, commit 등) |
46 | | -│ ├── core/ # Git 내부 처리 로직 (객체 저장, HEAD 갱신 등) |
47 | | -│ ├── domain/ # Git의 핵심 객체 (Blob, Tree, Commit, Branch) |
48 | | -│ ├── utils/ # 해시 계산 등 유틸 함수 |
49 | | -│ └── index.js # CLI 진입점 |
50 | | -├── .mygit/ # Git 객체가 저장되는 폴더 (init 후 생성됨) |
51 | | -├── .gitignore # Git 추적 제외 설정 |
52 | | -├── package.json # 프로젝트 정보 및 실행 스크립트 |
53 | | -└── README.md # 프로젝트 설명 문서 |
| 56 | +src |
| 57 | +├── index.js # CLI 진입점 (전략 패턴으로 명령어 분기) |
| 58 | +├── commands/ # 각 명령어 실행 함수 |
| 59 | +├── core/ # Git 내부 로직 (객체 생성, 해시 처리 등) |
| 60 | +├── strategies/ # 명령어 분기 로직 (전략 패턴) |
| 61 | +├── config/ # 사용자 정보 및 환경 설정 |
| 62 | +├── utils/ # 공통 유틸 함수 |
| 63 | +├── domain/ # 메시지, 상수, Enum 정의 |
| 64 | +└── __test__/ # Jest 테스트 코드 |
54 | 65 | ``` |
| 66 | + |
| 67 | +## 기술 스택 |
| 68 | + |
| 69 | +| 기술 | 사용 목적 및 역할 | |
| 70 | +| ------------------------ | ---------------------------------------- | |
| 71 | +| **Node.js** | CLI 기반 명령어 실행 환경 | |
| 72 | +| **Jest** | 커맨드별 단위 테스트 수행 | |
| 73 | +| **SHA-1 해시 구현** | Git 객체 간 참조를 위한 고유 식별자 생성 | |
| 74 | +| **파일 시스템 스토리지** | `.mini-git` 디렉토리에 Git 객체 저장 | |
| 75 | +| **JSDoc** | 함수 및 모듈 문서 자동 생성 도구 | |
| 76 | + |
| 77 | +> 복잡한 유틸 함수의 JSDoc 기반 자동 문서는 [여기서 확인](https://mindaaaa.github.io/mini-git/global.html)할 수 있습니다. |
| 78 | +
|
| 79 | +🔍 더 깊은 내용이 궁금하다면? |
0 commit comments