[전단 로 밍]Git 내부 원리-Git 대상
\#\#\#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 에 만 관심 을 가진다.이때 info 과 pack 두 개의 폴 더 만 있 고 우 리 는 그것 에 관심 을 가지 지 않 는 다.우 리 는 objects 에서 info 과 pack 을 제외 한 변화 에 만 관심 을 가진다.0x002 hash-object
이 명령 은 파일 의 대상 ID 를 계산 하고 blob 파일 을 만 들 수 있 습 니 다.여기 에는 두 가지 의미 가 있 습 니 다.1)대상 ID 를 계산 하고 대상 ID 는 무엇 입 니까?2)blob 파일 이 무엇 입 니까?왜 가능 합 니까?다음은 답 을 드 리 겠 습 니 다.
명령 실행:
$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4 -w 은 hash-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 서 류 를 제출 하 다 object 파일 형식object 파일 형식 은 모두 세 가지 가 있 습 니 다.blob:hash-object 생 성,파일 tree:write-tree 생 성,캐 시 영역 을 나타 내 는 파일 목록 commit:commit-tree 생 성,이번에 제출 한 파일 목록 그들의 관 계 는:
commit 은 tree 대상 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 자원
휴대 품
최근 에 재 미 있 는 라 이브 러 리 를 발 견 했 습 니 다.작 가 는 큰 사람 입 니 다.React 기반 현상 급 마이크로 장면 편집기 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZoopKeeper 시각 화 zkui 프레임 워 크프로필 zkui 는 zookeeper 에 웹 관리 인터페이스 를 제공 하여 zookeepr 의 노드 값 을 CRUD 로 조작 할 수 있 고 안전 인증 도 제공 합 니 다.github 주소:https://github....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.