나만의 Git, 직접 만들어보니...

by DD
1개월 전
조회수 10

Git의 핵심 원리를 이해하기 위해 자체 버전 관리 시스템을 Rust로 구현

SHA-256 해싱 알고리즘zstd 압축을 사용하여 파일 저장 및 관리

ls, commit, checkout 등 기본적인 기능 구현에 성공

커뮤니티에서는 도구의 내부 동작 원리를 이해하는 데 도움이 된다는 긍정적 평가

구현 과정에서 객체 파싱(Object Parsing)의 어려움을 언급

Git의 핵심 개념: 해싱(Hashing)과 객체 저장

저자는 Git의 핵심 원리를 이해하기 위해 자체 버전 관리 시스템을 구축했다. 특히, SHA-256 해싱(Hashing)을 사용하여 파일의 무결성을 보장하고, zstd 압축(Compression)을 통해 저장 공간을 효율적으로 관리했다. 이러한 과정을 통해 Git이 콘텐츠 주소 지정 파일 저장소(Content-addressable file store)임을 깨달았다고 밝힌다.

구현 과정: ls, commit, checkout 명령어

저자는 Rust를 사용하여 ls, commit, checkout과 같은 기본적인 Git 명령어를 구현했다. ls 명령어는 .tvcignore 파일을 참조하여 무시할 파일을 제외하고, 현재 디렉토리의 파일 목록과 해시 값을 출력한다. commit 명령어는 트리 객체(Tree Object)를 생성하고, 부모 커밋(Parent Commit), 작성자(Author), 메시지(Message)를 포함하는 커밋 객체를 생성한다. 마지막으로, checkout 명령어는 커밋 객체를 파싱하여 파일 구조를 복원한다.

성능 및 저장 공간 최적화

저자는 Git 호환성을 고려하지 않고, SHA-1 대신 SHA-256을 선택하여 해시 충돌(Hash Collision) 위험을 줄였다. 또한, zlib 대신 zstd를 사용하여 압축 효율을 높였다. 특히, 변경되지 않은 파일은 동일한 해시 값을 가지므로, 커밋 간에 중복된 파일 저장을 방지하여 저장 공간을 절약한다.

객체 파싱(Object Parsing)의 어려움

저자는 구현 과정에서 객체 파싱의 어려움을 언급하며, 향후 YAML 또는 JSON과 같은 형식으로 객체 정보를 저장하는 방안을 고려했다. 이는 코드의 가독성을 높이고, 유지 보수를 용이하게 하기 위한 것이다. 데이터 구조 설계(Data Structure Design)의 중요성을 강조하며, 더 나은 설계를 통해 코드 복잡성을 줄일 수 있음을 시사한다.

I made my own git

댓글 0

첫 번째 댓글을 남겨보세요!