Converting shallow Git bundles into normal repositories
The article discusses the process of converting a shallow Git bundle into a normal repository. It outlines the steps required to initialize a bare repository, extract and index the packfile, and set the reference to the appropriate object ID. The author suggests that the bundle format could benefit from improvements to better communicate shallowness.
- ▪The process begins by initializing a bare repository with a specified object format.
- ▪Next, the packfile is extracted and indexed to create necessary files for the repository.
- ▪Finally, the reference is set to the object ID, and the shallow commit is indicated.
Opening excerpt (first ~120 words) tap to expand
Let’s say you have a shallow Git bundle, i.e., not all referenced objects are present. How do you convert it into a normal shallow repository? Initialize the target as a bare-repo with your desired object-format. git init --bare --object-format=sha1 target.git && cd target.git Find the start of the pack in each bundle (version 2 packs starts with 5041 434b 0000 0002). In my case it’s byte offset 77. Extract and index the packfile, creating the .idx and .rev. tail -c +77 ../source.bundle | git index-pack --stdin Extract the ref OID and ref name from the bundle. oid="$(git bundle list-heads source.bundle | awk '{print $1}')" ref="$(git bundle list-heads source.bundle | awk '{print $2}')" Set the ref to the OID, and set HEAD to the ref.
…
Excerpt limited to ~120 words for fair-use compliance. The full article is at Runxiyu.