자바스크립트로 Git을 구현해 보자! (단계별 튜토리얼)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- Node.js 및 CLI 도구 개발에 관심 있는 프론트엔드/백엔드 개발자
- Git의 내부 동작 원리에 대한 이해를 원하는 중급 이상 개발자
- 개인 프로젝트 포트폴리오를 강화하고 싶은 개발자
핵심 요약
gitty
CLI 도구는Commander
,Inquirer
,Chalk
,Figlet
등을 사용해 모던한 인터랙티브 CLI를 구현.gitty
디렉토리 구조:objects/
(SHA-1 해시 기반의 Blobs, Trees, Commits 저장)refs/
(브랜치 포인터 저장)HEAD
(현재 체크아웃된 브랜치 추적)- 커밋 메커니즘:
add
명령어로 파일 해시(SHA-1
) 생성 후.gitty/objects
에 저장commit
명령어로 트리 해시, 부모 해시, 저자 정보, 메시지를 포함한 커밋 객체 생성
섹션별 세부 요약
1. 프로젝트 초기화
npm init -y
로 Node.js 프로젝트 생성package.json
에"type": "module"
설정하여 ES6 모듈 사용Commander
,Inquirer
,Chalk
,Figlet
패키지 설치gitty.js
실행 파일 생성 및package.json
의"bin"
필드 설정
2. CLI 구조 설계
gitty.js
에서commander
를 사용해init
,add
,commit
명령어 정의figlet
과chalk
로 CLI의 시각적 요소(로고, 색상) 구현commands/
디렉토리에 명령어별 로직 분리
3. `init` 명령어 구현
.gitty/objects
,.gitty/refs
디렉토리 생성HEAD
파일에refs/heads/main
포인터 저장- 기존
.gitty
디렉토리 존재 시 에러 처리
4. `add` 명령어 구현
- 파일 내용을
crypto
모듈의SHA-1
해시로 변환 - 해시 값을
.gitty/objects/
에 파일명으로 저장 index
파일에 파일 경로 ↔ 해시 매핑 저장
5. `commit` 명령어 구현
inquirer
를 통해 커밋 메시지 입력index
파일에서 트리 구조 생성 후 해시 저장- 기존 커밋의 해시를
HEAD
파일에서 추적하여 부모 해시 생성 - 커밋 객체(트리 해시, 부모 해시, 저자 정보, 타임스탬프, 메시지) 생성 후
.gitty/objects/
에 저장 - 브랜치 포인터 파일(
refs/heads/main
)에 새로운 커밋 해시 업데이트
6. 테스트 및 확장성
npm link
으로 전역 명령어 등록 후gitty init
,gitty add
,gitty commit
실행- 추가 기능 제안:
- 브랜치 관리(
gitty branch
) - 커밋 체크아웃(
gitty checkout
) - 원격 저장소 연동(
gitty remote
)
결론
gitty
는 Git의 핵심 기능(init
,add
,commit
)을 SHA-1 해시 기반의 컨텐츠 주소 저장소로 구현하여 버전 관리의 내부 동작을 이해할 수 있음- 개선 방향:
- 분기 기능(
branch
) 추가 - 원격 저장소(
remote
) 연동 - 커밋 체크아웃(
checkout
) 구현 - 실무 적용 시 CLI 도구 개발 및 Git 내부 메커니즘 학습에 유용한 프로젝트로 활용 가능