자바스크립트로 만든 간단한 Git 클론: Gitty 구축 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- Node.js 기초 지식이 있는 개발자
- Git 내부 동작 원리를 이해하고 싶은 중급 이상 개발자
- CLI 툴 개발에 관심 있는 프론트엔드/백엔드 개발자
- 난이도: 중급(ES6 모듈, CLI 개발, 해시 알고리즘 기초 지식 필요)
핵심 요약
- Node.js 기반 CLI 도구 Gitty 구축 –
gitty init
,gitty add
,gitty commit
명령어로 Git 핵심 기능 구현 - 내부 구조:
.gitty/objects
(SHA-1 해시 저장),.gitty/refs
(브랜치 포인터),.gitty/HEAD
(현재 브랜치 트래킹) - SHA-1 해시 기반 콘텐츠 주소 저장:
crypto.createHash('sha1')
로 파일 해시 생성 후.gitty/objects/[해시]
에 저장
섹션별 세부 요약
1. 프로젝트 초기화
mkdir gitty && npm init -y
로 디렉토리 생성package.json
에"type": "module"
설정으로 ES6 모듈 사용commander
,inquirer
,chalk
,figlet
패키지 설치
2. CLI 구조 설계
gitty.js
에서commander
로 명령어 정의:init
,add
,commit
package.json
에"bin": {"gy": "./gitty.js"}
추가로 CLI 실행 가능
3. `init` 명령어 구현
.gitty/objects
디렉토리 생성: 파일 데이터와 커밋 저장.gitty/refs
디렉토리 생성: 브랜치 포인터 저장.gitty/HEAD
파일 생성: 현재 브랜치 트래킹
4. `add` 명령어 구현
- 파일 내용을
crypto.createHash('sha1')
로 해싱 - 해시 값으로
.gitty/objects/[해시]
에 파일 저장 index
파일에파일명 → 해시
매핑 저장
5. `commit` 명령어 구현
inquirer
로 커밋 메시지 입력tree
객체 생성: 현재 디렉토리 상태 저장commit
객체 생성:tree
,parent
,author
,timestamp
포함commit
객체를 SHA-1 해시로.gitty/objects/[해시]
에 저장- 브랜치 포인터(
.gitty/refs/heads/main
) 업데이트
결론
- 실무 팁:
gitty commit
으로 생성된 커밋은.gitty/objects
에 영구 저장되며,HEAD
파일을 통해 현재 브랜치 트래킹 - 추천 확장 기능: 브랜치(
gitty branch
), 체크아웃(gitty checkout
), 원격 저장소(gitty remote
) 기능 추가 가능 - 핵심 성과: Git의 내부 동작 원리 이해 및 Node.js 기반 CLI 툴 개발 실습 완료