Git 책에는 색인 에 포함 된 내용에 대한 기사가 있습니다 .
인덱스는 .git/index
경로 이름의 정렬 된 목록을 포함 하는 이진 파일 (일반적으로로 유지됨 )이며, 각각 권한과 BLOB 개체의 SHA1이 있습니다. git ls-files
색인의 내용을 보여줄 수 있습니다.
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
선정적인 이눔 문제는 그 구조에 대한 좀 더 자세한 내용을 제공합니다 :
인덱스는 git에서 가장 중요한 데이터 구조 중 하나입니다.
경로 목록과 객체 이름을 기록하여 가상 작업 트리 상태를 나타내며 커밋 할 다음 트리 객체를 작성하기위한 준비 영역 역할을합니다.
상태는 작업 트리의 파일과 반드시 일치 할 필요는 없으며 종종 일치하지 않아도된다는 점에서 "가상"입니다.
자세한 내용은 cf. " git / git / Documentation / technical / index-format.txt ":
Git 인덱스 파일의 형식은 다음과 같습니다
모든 이진수는 네트워크 바이트 순서입니다. 달리 명시되지 않는 한
버전 2 가 여기에 설명되어 있습니다.
- 다음으로 구성된 12 바이트 헤더 :
- 4 바이트 서명 :
서명은 { ' D
', ' I
', ' R
', ' C
'}입니다 ( " dircache
"의 약자 )
- 4 바이트 버전 번호 :
현재 지원되는 버전은 2, 3 및 4입니다.
- 32 비트 인덱스 항목 수
- 여러 개의 정렬 된 색인 항목 .
- 확장 :
확장은 서명으로 식별됩니다.
Git이 이해하지 못하면 선택적 확장은 무시할 수 있습니다.
힘내는 현재 캐시 트리를 지원하고 실행 취소 확장을 해결합니다.
- 4 바이트 확장 서명. 첫 번째 바이트가 '
A
'.. ' Z
'인 경우 확장자는 선택 사항이며 무시할 수 있습니다.
- 확장의 32 비트 크기
- 확장 데이터
- 이 체크섬 이전의 인덱스 파일 내용에 대한 160 비트 SHA-1
mljrg 의견 :
인덱스가 다음 커밋이 준비된 장소 인 경우 커밋 git ls-files -s
후에 " "가 아무것도 반환 하지 않는 이유는 무엇입니까?
때문에 인덱스를 추적하는 것을 나타내고 , 오른쪽 커밋 후 마지막 (커밋 없습니다, 무엇을 추적하는 것은 동일하다 git diff --cached
반환 아무것도).
그래서 git ls-files -s
모든 파일을 추적 목록 (개체 이름, 모드 비트 및 출력에 단수).
해당 요소 (추적 된 요소) 목록은 커밋 내용으로 초기화됩니다.
분기를 전환하면 방금 전환 한 분기에서 참조하는 커밋으로 인덱스 내용이 재설정됩니다.
Git 2.20 (Q4 2018)은 IEOT (Index Entry Offset Table )를 추가합니다 .
참조 77ff112 커밋 , 3,255,089 커밋 , abb4bb8 커밋 , c780b9c 커밋 , 3b1d9e0 커밋 , 371ed0d 커밋 에 의해 (2018년 10월 10일) 벤 씩씩한를 ( benpeart
) . Nguyễn Thái Ngọc Duy ( )의 commit 252d079 (2018 년 9 월 26 일)를
참조하십시오 . ( Junio C Hamano 에 의해 병합 - 커밋 e27bfaa , 2018 년 10 월 19 일)pclouds
gitster
ieot : IEOT (Index Entry Offset Table) 확장 추가
이 패치를 사용하면 캐시에로드 및 변환을 효율적으로 멀티 스레딩 할 수있는 인덱스에 추가 데이터를 추가하여 인덱스로드의 CPU 비용을 처리 할 수 있습니다.
인덱스 파일의 캐시 항목 블록에 오프셋 테이블 인 (선택적) 인덱스 확장을 추가하여이를 수행합니다.
V4 인덱스에 대해이 작업을 수행하려면 캐시 항목을 쓸 때 이전 항목의 경로 이름이 완전히 다른 것처럼 현재 항목을 인코딩하여 접두사 압축을 주기적으로 "재설정"하고 IEOT에 해당 항목의 오프셋을 저장합니다. .
기본적으로 V4 인덱스를 사용하면 접두사 압축 항목 블록으로 오프셋을 생성합니다.
으로 새로운 index.threads 설정 설정 , 인덱스 로딩 이제 빠릅니다.
그 결과 ( IEOT 사용 ), 7bd9631을 커밋read-cache.c load_cache_entries_threaded()
하여 Git 2.23 (Q3 2019) 의 기능을 정리하십시오 .
참조 8,373,037 커밋 , d713e88 커밋 , d92349d 커밋 , 113c29a 커밋 , 커밋 c95fc72 , 7a2a721 커밋 , c016579 커밋 , 커밋 be27fb7 , 13a1781 커밋 , 7bd9631 커밋 , 3c1dce8 커밋 , cf7a901 커밋 , d64db5b 커밋 , 76a7bc0 커밋 에 의해 (2019 09 월) 제프 킹 ( peff
) .
(의해 병합 Junio C 하마노 - gitster
- 에 커밋 c0e78f7 13 유월 2019)
읽기 캐시 : 스레드로드에서 사용되지 않은 매개 변수 삭제
이 load_cache_entries_threaded()
함수는 src_offset
사용하지 않는 매개 변수를 사용합니다. 이것은 77ff112 에서 시작된 이래로 계속되었습니다 ( read-cache
: 작업자 스레드에 캐시 항목로드, 2018-10-10, Git v2.20.0-rc0).
메일 링리스트를 파고 들어, 그 파라미터는 시리즈 의 초기 반복의 일부 였지만 코드가 IEOT 확장을 사용하도록 전환 할 때 불필요 해졌습니다.