164 lines · 5.4 KB · Text
RawDownload
GIT bitmap v1 format==================== 	- A header appears at the beginning: 		4-byte signature: {'B', 'I', 'T', 'M'} 		2-byte version number (network byte order)			The current implementation only supports version 1			of the bitmap index (the same one as JGit). 		2-byte flags (network byte order) 			The following flags are supported: 			- BITMAP_OPT_FULL_DAG (0x1) REQUIRED			This flag must always be present. It implies that the bitmap			index has been generated for a packfile with full closure			(i.e. where every single object in the packfile can find			 its parent links inside the same packfile). This is a			requirement for the bitmap index format, also present in JGit,			that greatly reduces the complexity of the implementation. 			- BITMAP_OPT_HASH_CACHE (0x4)			If present, the end of the bitmap file contains			`N` 32-bit name-hash values, one per object in the			pack. The format and meaning of the name-hash is			described below. 		4-byte entry count (network byte order) 			The total count of entries (bitmapped commits) in this bitmap index. 		20-byte checksum 			The SHA1 checksum of the pack this bitmap index belongs to. 	- 4 EWAH bitmaps that act as type indexes 		Type indexes are serialized after the hash cache in the shape		of four EWAH bitmaps stored consecutively (see Appendix A for		the serialization format of an EWAH bitmap). 		There is a bitmap for each Git object type, stored in the following		order: 			- Commits			- Trees			- Blobs			- Tags 		In each bitmap, the `n`th bit is set to true if the `n`th object		in the packfile is of that type. 		The obvious consequence is that the OR of all 4 bitmaps will result		in a full set (all bits set), and the AND of all 4 bitmaps will		result in an empty bitmap (no bits set). 	- N entries with compressed bitmaps, one for each indexed commit 		Where `N` is the total amount of entries in this bitmap index.		Each entry contains the following: 		- 4-byte object position (network byte order)			The position **in the index for the packfile** where the			bitmap for this commit is found. 		- 1-byte XOR-offset			The xor offset used to compress this bitmap. For an entry			in position `x`, a XOR offset of `y` means that the actual			bitmap representing this commit is composed by XORing the			bitmap for this entry with the bitmap in entry `x-y` (i.e.			the bitmap `y` entries before this one). 			Note that this compression can be recursive. In order to			XOR this entry with a previous one, the previous entry needs			to be decompressed first, and so on. 			The hard-limit for this offset is 160 (an entry can only be			xor'ed against one of the 160 entries preceding it). This			number is always positive, and hence entries are always xor'ed			with **previous** bitmaps, not bitmaps that will come afterwards			in the index. 		- 1-byte flags for this bitmap			At the moment the only available flag is `0x1`, which hints			that this bitmap can be re-used when rebuilding bitmap indexes			for the repository. 		- The compressed bitmap itself, see Appendix A. == Appendix A: Serialization format for an EWAH bitmap Ewah bitmaps are serialized in the same protocol as the JAVAEWAHlibrary, making them backwards compatible with the JGitimplementation: 	- 4-byte number of bits of the resulting UNCOMPRESSED bitmap 	- 4-byte number of words of the COMPRESSED bitmap, when stored 	- N x 8-byte words, as specified by the previous field 		This is the actual content of the compressed bitmap. 	- 4-byte position of the current RLW for the compressed		bitmap All words are stored in network byte order for their correspondingsizes. The compressed bitmap is stored in a form of run-length encoding, asfollows.  It consists of a concatenation of an arbitrary number ofchunks.  Each chunk consists of one or more 64-bit words      H  L_1  L_2  L_3 .... L_M H is called RLW (run length word).  It consists of (from lower to higherorder bits):      - 1 bit: the repeated bit B      - 32 bits: repetition count K (unsigned)      - 31 bits: literal word count M (unsigned) The bitstream represented by the above chunk is then:      - K repetitions of B      - The bits stored in `L_1` through `L_M`.  Within a word, bits at       lower order come earlier in the stream than those at higher       order. The next word after `L_M` (if any) must again be a RLW, for the nextchunk.  For efficient appending to the bitstream, the EWAH stores apointer to the last RLW in the stream.  == Appendix B: Optional Bitmap Sections These sections may or may not be present in the `.bitmap` file; theirpresence is indicated by the header flags section described above. Name-hash cache--------------- If the BITMAP_OPT_HASH_CACHE flag is set, the end of the bitmap containsa cache of 32-bit values, one per object in the pack. The value atposition `i` is the hash of the pathname at which the `i`th object(counting in index order) in the pack can be found.  This can be fedinto the delta heuristics to compare objects with similar pathnames. The hash algorithm used is:     hash = 0;    while ((c = *name++))	    if (!isspace(c))		    hash = (hash >> 2) + (c << 24); Note that this hashing scheme is tied to the BITMAP_OPT_HASH_CACHE flag.If implementations want to choose a different hashing scheme, they arefree to do so, but MUST allocate a new header flag (because comparinghashes made under two different schemes would be pointless).