[전단 로 밍]Git 내부 원리-Git 대상

8153 단어 git.node.js
\#\##이 글 은 Git Pro 10.2 Git 내부 원리-Git 대상 장 에 대한 해석 과 전환 입 니 다.주로 두 가 지 를 소개 합 니 다.1)Git 바 텀 명령 으로 제출 을 완료 하고 2)NodeJS 로 Git 대상 을 해석 하려 고 시도 합 니 다(글 에서 제공 하 는 것 은 Ruby 입 니 다).
\#\#\#0x 001 로 컬 창고 초기 화:
$ mkdir git-test
$ cd git-test
$ git init
Initialized empty Git repository in ...

파일 구조 보기:
+ git-test
   + .git
       + branches
       - config
       - description
       - HEAD
       + hooks
       + info
       + objects
           + info
           + pack
       + refs

다른 것 은 잠시 관심 을 가지 지 않 고 objects 에 만 관심 을 가진다.이때 infopack 두 개의 폴 더 만 있 고 우 리 는 그것 에 관심 을 가지 지 않 는 다.우 리 는 objects 에서 infopack 을 제외 한 변화 에 만 관심 을 가진다.
0x002 hash-object
이 명령 은 파일 의 대상 ID 를 계산 하고 blob 파일 을 만 들 수 있 습 니 다.여기 에는 두 가지 의미 가 있 습 니 다.1)대상 ID 를 계산 하고 대상 ID 는 무엇 입 니까?2)blob 파일 이 무엇 입 니까?왜 가능 합 니까?다음은 답 을 드 리 겠 습 니 다.
명령 실행:
$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4
-whash-object 저장 데이터 대상 을 지시 하고 지정 하지 않 으 면 계 산 된 objectId 를 되 돌려 줍 니 다.--stdin 지시 가 표준 입력 에서 내용 을 읽 는 것,즉 test content 을 내용 으로 계산 하 는 것 이다.
이 명령 을 실행 할 때 40 글자 길이 의 SHA 1 해시 값 을 되 돌려 줍 니 다.d670460b4b4aece5915caf5c68d12f560a9fe3e4,-w 을 제 정 했 기 때문에 git 은 이번 계산 을 저장 하고 objects 의 파일 을 조회 합 니 다.
+ objects
    + d6
        - 70460b4b4aece5915caf5c68d12f560a9fe3e4

폴 더 d6 이 하나 더 있 고 d6 에 파일 70460b4b4aece5915caf5c68d12f560a9fe3e4 이 있 는데 이 두 가 지 를 연결 하면 방금 생 성 된 objectID 이다.
만약 우리 가 이 명령 을 여러 번 집행 한다 면,이 파일 은 변화 가 없 을 것 이다.왜냐하면 이미 존재 하기 때문이다.이것 은 바로 이전에 생 성 될 수 있 는 원인 이다.
만약 우리 가 내용 을 바꾼다 면,새로운 objectID 과 새로운 blob 파일 을 생 성 할 것 이다.
0x003 cat-file
우 리 는 파일 을 어떻게 저장 할 때 까지 어떻게 읽 습 니까?cat-file 사용 가능
$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
test content

0x 004 파일 저장 및 버 전 복구
다음 에 우 리 는 내용 을 직접 사용 하지 않 고 파일 을 사용 합 니 다.
$ echo 'version 1' > test.txt
$ git hash-object -w test.txt
83baae61804e65cc73a7201a7252750c76066a30

그리고 이 파일 을 업데이트 하고 저장 합 니 다.
$ echo 'version 2' > test.txt
$ git hash-object -w test.txt
1f7a7a472abf3dd9643fd615f6da379c4acb3e3a

이때 의 objects
+ objects
    + 1f
        - 7a7a472abf3dd9643fd615f6da379c4acb3e3a
    + 83
        - baae61804e65cc73a7201a7252750c76066a30
    + d6
        - 70460b4b4aece5915caf5c68d12f560a9fe3e4

그리고 파일 내용 을 첫 번 째 버 전 으로 복원 하 겠 습 니 다.
$ git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30 > test.txt
$ cat test.txt
version 1

아니면 두 번 째 버 전.
$ git cat-file -p 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a > test.txt
$ cat test.txt
version 2

0x 005 트 리 대상 과 write-tree
파일 을 캐 시 영역 에 추가 합 니 다.
$ git update-index --add --cacheinfo 100644 \
  83baae61804e65cc73a7201a7252750c76066a30 test.txt

캐 시 영역 내용 을 트 리 대상 에 기록 합 니 다.
$ git write-tree
d8329fc1cc938780ffdd9f94e0d364e0ea74f579
$ git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579
100644 blob 83baae61804e65cc73a7201a7252750c76066a30      test.txt

새 대상 을 만 듭 니 다.test.txt 의 두 번 째 버 전과 새 파일 을 포함 합 니 다.
$ echo 'new file' > new.txt
$ git update-index --cacheinfo 100644 \
  1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt
$ git update-index --add new.txt
$ git write-tree
0155eb4229851634a0f03eb265b69f5a2d56f341
$ git cat-file -p 0155eb4229851634a0f03eb265b69f5a2d56f341
100644 blob fa49b077972391ad58037050f2a75f74e3671e92      new.txt
100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a      test.txt

0x 006 commt 와 commt-tree 제출
트 리 대상 이 있 으 면 이 트 리 대상 을 제출 하여 commit 을 생 성 할 수 있 습 니 다.
$ echo 'first commit' | git commit-tree d8329f
b51096bf62fa145c0b95ce18dc3020daa1f2556e

이거 봐 요.commit.
$ git cat-file -p b51096bf62fa145c0b95ce18dc3020daa1f2556e
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon  1243040974 -0700
committer Scott Chacon  1243040974 -0700

first commit

이 어 두 번 째 트 리 대상 을 제출 하고 -p 을 사용 하여 제출 한 이전 commit 을 지정 합 니 다.
$ echo 'second commit' | git commit-tree 0155eb4229851634a0f03eb265b69f5a2d56f341 -p b51096bf62fa145c0b95ce18dc3020daa1f2556e
bf41fa3700a67914b3b45eefced02fffcdaf4464
git log 을 사용 하여 기록 보기
commit bf41fa3700a67914b3b45eefced02fffcdaf4464
Author: lyxxxx 
Date:   Sun Nov 17 22:14:36 2019 +0800

    second commit

 new.txt  | 1 +
 test.txt | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

commit b51096bf62fa145c0b95ce18dc3020daa1f2556e
Author: lyxxxx 
Date:   Sun Nov 17 22:07:01 2019 +0800

    first commit

 test.txt | 1 +
 1 file changed, 1 insertion(+)

이것 은 바로 기본 명령 을 사용 하여 Git 을 만 들 고 역 사 를 제출 하 는 과정 입 니 다.주로 5 개의 명령 과 관련 됩 니 다.
  • hash-object:objectID 을 계산 하고 blob 파일
  • 을 만 듭 니 다.
  • cat-file:생산 된 object 파일 읽 기
  • update-index:임시 저장 소 파일 업데이트
  • write-tree:임시 저장 소 파일 을 tree 파일
  • 에 기록 합 니 다.
  • commit-tree:tree 서 류 를 제출 하 다
  • 0x 007 object 파일 형식object 파일 형식 은 모두 세 가지 가 있 습 니 다.
  • blob:hash-object 생 성,파일
  • 표시
  • tree:write-tree 생 성,캐 시 영역 을 나타 내 는 파일 목록
  • commit:commit-tree 생 성,이번에 제출 한 파일 목록
  • 을 표시 합 니 다.
    그들의 관 계 는:
  • committree 대상
  • 을 포함 합 니 다.
  • tree 은 여러 개의 blob 대상 과 tree 대상
  • 을 포함한다.
    0x 008 objectID 어떻게 생 성 합 니까?
    다음은 NodeJS 을 사용 하여 objectID 을 만 드 는 방법 을 보 여 줍 니 다.
    만약 에 우리 가 저장 할 내용 이 what is up, doc? 이 라 고 가정 하면
    const content = 'what is up, doc?'
    const type = 'blob'
    object 대상 의 저장 형식 은:
    const store = `${type} ${content.length}\0${content}`

    그리고 계산 sh1 :
    const crypto = require('crypto');
    
    const hash = crypto.createHash('sha1');
    hash.update(store);
    const objectID = hash.digest('hex');

    마지막 으로 계산 한 결 과 는:
    bd9dbf5aae1a3862dd1526723246b20206e5fc37

    다음은 저장 입 니 다.저장 할 때 압축 을 실행 한 후에 저장 합 니 다.
    const zlib = require('zlib');
    
    const result = zlib.deflateSync(Buffer.from(store))

    그리고 objectID 분할 에 따라 objects 폴 더 에 저장 하면 됩 니 다.
    + objects
        + bd
            - 9dbf5aae1a3862dd1526723246b20206e5fc37

    전체 원본:
    const zlib = require('zlib');
    const fs = require('fs');
    const Buffer = require('buffer').Buffer
    const crypto = require('crypto');
    
    const type = 'blob'
    const content = process.argv[2]
    
    const store = `${type} ${content.length}\0${content}`
    
    const hash = crypto.createHash('sha1');
    hash.update(store)
    const objectID = hash.digest('hex')
    const result = zlib.deflateSync(Buffer.from(store))
    
    const path = '.git/objects'
    const [a, b, ...file] = objectID
    const dirPath = `${path}/${a}${b}`
    const filePath = `${dirPath}/${file.join('')}`
    fs.mkdirSync(dirPath)
    fs.writeFileSync(filePath)

    0x 009 자원
  • 공식 원문
  • Git 원리 입문-완 일 봉
  • 장 소스 코드:이 프로젝트 는 제 가 계속 유지 하고 NodeJS 로 miniGit 을 써 서 놀 려 고 합 니 다.

  • 휴대 품
    최근 에 재 미 있 는 라 이브 러 리 를 발 견 했 습 니 다.작 가 는 큰 사람 입 니 다.React 기반 현상 급 마이크로 장면 편집기 입 니 다.

    좋은 웹페이지 즐겨찾기