"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Mini-git, 파일이 Git 개체에 저장되는 방식 이해하기

Mini-git, 파일이 Git 개체에 저장되는 방식 이해하기

2024-08-24에 게시됨
검색:197

Mini-git, Understanding How Files Are Stored in Git Objects

어제 저는 Git의 핵심 기능 중 하나를 직접 구현하기 시작했습니다. 구체적으로 파일 저장 방법, Git 객체 정의, 해싱 및 압축 프로세스 등을 구현했습니다. 개발하는 데 4시간이 걸렸으며, 이 글에서는 저의 사고 과정과 접근 방식을 안내해 드리겠습니다.

파일을 커밋하면 어떻게 되나요?

Git에서 파일을 커밋하면 내부적으로 몇 가지 중요한 단계가 발생합니다.

파일 압축:

파일 내용은 zlib 알고리즘을 사용하여 압축되어 크기를 줄입니다. 이 압축된 콘텐츠는 Git 개체 데이터베이스에 저장됩니다.

해시 계산:

압축된 파일 콘텐츠에서 고유한 SHA-1 해시가 생성됩니다. 이 해시는 Git 개체 데이터베이스에 있는 파일의 식별자 역할을 합니다.

개체 저장:

개체 파일은 .mygit/objects 디렉터리에 저장되며 해시의 처음 두 문자로 구성됩니다. 이 구조를 사용하면 객체를 보다 쉽게 ​​관리하고 효율적으로 검색할 수 있습니다.
커밋 정보 업데이트:

git에 파일이 어떻게 저장되는지 보여줍니다.
하나의 파일을 고려하여 커밋 기능을 구현했습니다.

  1. 모든 파일에 대해 해시를 계산했습니다.
  2. 개체 폴더 안에 해시의 처음 두 문자와 동일한 이름으로 새 폴더가 생성됩니다.
  3. 그리고 해당 폴더 안에 남은 해시를 이름으로 하여 파일이 생성됩니다.(이 파일은 커밋된 파일의 압축 형식을 저장합니다.)
  4. 파일의 새로 계산된 해시와 마지막으로 계산된 해시를 비교하여 변경 사항을 감지했습니다.

변화 감지

이 알고리즘은 내 접근 방식을 기반으로 구현했지만 Git은 이러한 작업에 더 효율적인 알고리즘을 사용합니다.

  1. oldContent 및 newContent에서 추출된 행 배열
  2. 라인을 키로, 인덱스를 값으로 저장하는 맵을 만들었습니다.
  3. oldContent 및 newContent에 공통 줄의 인덱스를 저장하기 위해 두 개의 새로운 배열을 만들었습니다. 4.예: OldCommonarray = [0 , 3] 그러면 삭제된 줄은 [1,2]
  4. 가 됩니다.

GitHub 저장소
링크드인

시간 내주셔서 감사합니다.

릴리스 선언문 이 기사는 https://dev.to/keerthivardhan1/mini-git-understanding-how-files-are-stored-in-git-objects-5bfb?1에 복제되어 있습니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3