[전단 로 밍]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에 따라 라이센스가 부여됩니다.