GITPROTOCOL-PACK(5) Git Manual GITPROTOCOL-PACK(5) (NAME) gitprotocol-pack - (SYNOPSIS) (DESCRIPTION) (packfiles) ssh:// git:// http:// file:// . : (push) (fetch) . (ssh git file) . http gitprotocol- http(5) . upload-pack fetch-pack receive-pack send-pack . . PKT-LINE (PKT-LINE FORMAT) pkt-line gitprotocol-common(5) . PKT-LINE(...) LF pkt-line : LF . (error packet) pkt-line . error-line = PKT-LINE("ERR" SP explanation-text) PKT-LINE(...) . . (TRANSPORTS) . Git ( upload-pack receive-pack ) . SSH upload-pack receive-pack SSH SSH . file:// upload-pack receive-pack . (EXTRA PARAMETERS) . << >> (Extra Parameters) Git SSH HTTP . = . . "version" 1 2 . gitprotocol-v2(5) . GIT (GIT TRANSPORT) Git pkt-line NUL NUL . 0033git-upload-pack /project.git\0host=myserver.com\0 NUL NUL : 003egit-upload-pack /project.git\0host=myserver.com\0\0version=1\0 git-proto-request = request-command SP pathname NUL [ host-parameter NUL ] [ NUL extra-parameters ] request-command = "git-upload-pack" / "git-receive-pack" / "git-upload-archive" ; case sensitive pathname = *( %x01-ff ) ; exclude NUL host-parameter = "host=" hostname [ ":" port ] extra-parameters = 1*extra-parameter extra-parameter = 1*( %x01-ff ) NUL host-parameter git-daemon . --interpolated-path git daemon %H/%CH . upload-pack : $ echo -e -n \ "003agit-upload-pack /schacon/gitbook.git\0host=example.com\0" | nc -v example.com 9418 SSH (SSH TRANSPORT) upload-pack receive-pack SSH SSH . : $ ssh git.example.com "git-upload-pack '/project.git'" (push) (pull) SSH SSH . . URI ssh:// URI / ( ) git-upload-pack . git clone ssh://user@example.com/project.git | v ssh user@example.com "git-upload-pack '/project.git'" URI "user@host:path" : git clone user@example.com:project.git | v ssh user@example.com "git-upload-pack 'project.git'" ~ / . ssh://user@example.com/~alice/project.git, | v ssh user@example.com "git-upload-pack '~alice/project.git'" protocol.version GIT_PROTOCOL . ssh.variant ssh . : o << >> ( git-upload-pack) o . (FETCHING DATA FROM A SERVER) (fetch) . . (REFERENCE DISCOVERY) ( "version=1" ) ( ) . $ echo -e -n "0045git-upload-pack /schacon/gitbook.git\0host=example.com\0\0version=1\0" | nc -v example.com 9418 000eversion 1 00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag 00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration 003f7217a7c7e582c46cec22a130adf4b9d7d950fba0 refs/heads/master 003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9 003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0 003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{} 0000 pkt-line . C locale . HEAD . HEAD . NUL . (peeled) ( "ref^{}") . (annotated tag) (peel) . advertised-refs = *1("version 1") (no-refs / list-of-refs) *shallow flush-pkt no-refs = PKT-LINE(zero-id SP "capabilities^{}" NUL capability-list) list-of-refs = first-ref *other-ref first-ref = PKT-LINE(obj-id SP refname NUL capability-list) other-ref = PKT-LINE(other-tip / other-peeled) other-tip = obj-id SP refname other-peeled = obj-id SP refname "^{}" shallow = PKT-LINE("shallow" SP obj-id) capability-list = capability *(SP capability) capability = 1*(LC_ALPHA / DIGIT / "-" / "_") LC_ALPHA = %x61-7A obj-id obj-id . protocol-capabilities.txt . (PACKFILE NEGOTIATION) flush-pkt . ls-remote . (shallow) ( ) ( ) . want . upload-request = want-list *shallow-line *1depth-request [filter-request] flush-pkt want-list = first-want *additional-want shallow-line = PKT-LINE("shallow" SP obj-id) depth-request = PKT-LINE("deepen" SP depth) / PKT-LINE("deepen-since" SP timestamp) / PKT-LINE("deepen-not" SP ref) first-want = PKT-LINE("want" SP obj-id SP capability-list) additional-want = PKT-LINE("want" SP obj-id) depth = 1*DIGIT filter-request = PKT-LINE("filter" SP filter-spec) obj-id want . want . want obj-id . obj-id (shallow) ( ) shallow . ( ) deepen . . . (shallow) . . pack-objects ( ) . (partial clone) (partial fetch) . filter-spec want . filter-spec rev-list . want shallow ( deepen) flush-pkt . . . shallow-update = *shallow-line *unshallow-line flush-pkt shallow-line = PKT-LINE("shallow" SP obj-id) unshallow-line = PKT-LINE("unshallow" SP obj-id) . (wants) . shallow . ( ) unshallow . (unshallow) . obj-id have . multi_ack flush-pkt . << >> (in-flight on the wire) . upload-haves = have-list compute-end have-list = *have-line have-line = PKT-LINE("have" SP obj-id) compute-end = flush-pkt / PKT-LINE("done") have ACK obj-id . ack obj-id ACK . multi_ack: o ACK obj-id continue . o have obj-id ACK . o NAK - done have. multi_ack_detailed: o ACK ACK obj-id ready ACK obj-id common . multi_ack multi_ack_detailed: o upload-pack "ACK obj-id" . "done" . o upload-pack flush-pkt "NAK" . ACK flush-pkt . ACK ( ACK --date-order --date-order ) ( have ACK - ) done . done . "ACK %s continue" . . done ACK obj-id NAK . obj-id . done ACK multi_ack multi_ack_detailed . done NAK . ACK NAK ( want ). . server-response = *ack_multi ack / nak ack_multi = PKT-LINE("ACK" SP obj-id ack_status) ack_status = "continue" / "common" / "ready" ack = PKT-LINE("ACK" SP obj-id) nak = PKT-LINE("NAK") ( have): C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ side-band-64k ofs-delta\n C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n C: 0032want 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01\n C: 0032want 74730d410fcb6603ace96f1dc55ea6196122532d\n C: 0000 C: 0009done\n S: 0008NAK\n S: [PACKFILE] () : C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ side-band-64k ofs-delta\n C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n C: 0000 C: 0032have 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01\n C: [30 more have lines] C: 0032have 74730d410fcb6603ace96f1dc55ea6196122532d\n C: 0000 S: 003aACK 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01 continue\n S: 003aACK 74730d410fcb6603ace96f1dc55ea6196122532d continue\n S: 0008NAK\n C: 0009done\n S: 0031ACK 74730d410fcb6603ace96f1dc55ea6196122532d\n S: [PACKFILE] (PACKFILE DATA) (packfile) . gitformat-pack(5) . side-band side-band-64k . packet-line (sideband) . side-band pkt-line . side-band-64k pkt-line . 1 2 3 . 1 2 (stderr) 3 . side-band . (PUSHING DATA TO A SERVER) receive-pack . . (AUTHENTICATION) . SSH receive-pack . receive-pack Git (9418) . (REFERENCE DISCOVERY) . obj-id packet-line flush-pkt . - report-status report-status-v2 delete-refs ofs-delta atomic push-options. (REFERENCE UPDATE REQUEST AND PACKFILE TRANSFER) . obj-id obj-id . flush-pkt . update-requests = *shallow ( command-list | push-cert ) shallow = PKT-LINE("shallow" SP obj-id) command-list = PKT-LINE(command NUL capability-list) *PKT-LINE(command) flush-pkt command = create / delete / update create = zero-id SP new-id SP name delete = old-id SP zero-id SP name update = old-id SP new-id SP name old-id = obj-id new-id = obj-id push-cert = PKT-LINE("push-cert" NUL capability-list LF) PKT-LINE("certificate version 0.1" LF) PKT-LINE("pusher" SP ident LF) PKT-LINE("pushee" SP url LF) PKT-LINE("nonce" SP nonce LF) *PKT-LINE("push-option" SP push-option LF) PKT-LINE(LF) *PKT-LINE(command LF) *PKT-LINE(gpg-signature-lines LF) PKT-LINE("push-cert-end" LF) push-option = 1*( VCHAR | SP ) push-options push-options push flush-pkt . push-options = *PKT-LINE(push-option) flush-pkt push push options push options push push . ( push push .) . . packfile = "PACK" 28*(OCTET) delete-refs delete . push-cert push-cert . push-cert command-list push . delete . create update . . obj-id . (obj-id old-id ) (update hooks) . . PUSH (PUSH CERTIFICATE) push . . LF PKT-LINE push-cert . : pusher ident GPG " ". pushee url ( URL ) git push . nonce nonce nonce (replay attacks). GPG (detached signature) push . (pusher) . (REPORT STATUS) report-status report-status-v2 . . unpack ok unpack [error] . . ok [refname] ng [refname] [error] . report-status = unpack-status 1*(command-status) flush-pkt unpack-status = PKT-LINE("unpack" SP unpack-result) unpack-result = "ok" / error-msg command-status = command-ok / command-fail command-ok = PKT-LINE("ok" SP refname) command-fail = PKT-LINE("ng" SP refname SP error-msg) error-msg = 1*(OCTET) ; where not "ok" report-status-v2 proc-receive . proc-receive new-oid old-oid . report-status-v2 = unpack-status 1*(command-status-v2) flush-pkt unpack-status = PKT-LINE("unpack" SP unpack-result) unpack-result = "ok" / error-msg command-status-v2 = command-ok-v2 / command-fail command-ok-v2 = command-ok *option-line command-ok = PKT-LINE("ok" SP refname) command-fail = PKT-LINE("ng" SP refname SP error-msg) error-msg = 1*(OCTET) ; where not "ok" option-line = *1(option-refname) *1(option-old-oid) *1(option-new-oid) *1(option-forced-update) option-refname = PKT-LINE("option" SP "refname" SP refname) option-old-oid = PKT-LINE("option" SP "old-oid" SP obj-id) option-new-oid = PKT-LINE("option" SP "new-oid" SP obj-id) option-force = PKT-LINE("option" SP "forced-update") . push . (non-fast-forward) . . / : S: 006274730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n S: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe refs/heads/debug\n S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/master\n S: 003d74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/team\n S: 0000 C: 00677d1665144a3a975c05f1f43902ddaf084e784dbe 74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/debug\n C: 006874730d410fcb6603ace96f1dc55ea6196122532d 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a refs/heads/master\n C: 0000 C: [PACKDATA] S: 000eunpack ok\n S: 0018ok refs/heads/debug\n S: 002ang refs/heads/master non-fast-forward\n (GIT) git(1) (NOTES) 1. email@address mailto:email@address Git 2.55.0 2026-06-29 GITPROTOCOL-PACK(5)