AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

자바스크립트로 만든 간단한 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 툴 개발 실습 완료