>웹 프론트엔드 >JS 튜토리얼 >Mini-git, 파일이 Git 개체에 저장되는 방식 이해하기

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

WBOY
WBOY원래의
2024-08-22 18:45:03298검색

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 저장소
링크드인

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

위 내용은 Mini-git, 파일이 Git 개체에 저장되는 방식 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.