'\" t
.\"     Title: git-send-pack
.\"    Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
.\"      Date: 09/29/2025
.\"    Manual: Git Manual
.\"    Source: Git 1.8.3.1
.\"  Language: English
.\"
.TH "GIT\-SEND\-PACK" "1" "09/29/2025" "Git 1\&.8\&.3\&.1" "Git Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
git-send-pack \- Push objects over Git protocol to another repository
.SH "SYNOPSIS"
.sp
.nf
\fIgit send\-pack\fR [\-\-all] [\-\-dry\-run] [\-\-force] [\-\-receive\-pack=<git\-receive\-pack>] [\-\-verbose] [\-\-thin] [<host>:]<directory> [<ref>\&...]
.fi
.sp
.SH "DESCRIPTION"
.sp
Usually you would want to use \fIgit push\fR, which is a higher\-level wrapper of this command, instead\&. See \fBgit-push\fR(1)\&.
.sp
Invokes \fIgit\-receive\-pack\fR on a possibly remote repository, and updates it from the current repository, sending named refs\&.
.SH "OPTIONS"
.PP
\-\-receive\-pack=<git\-receive\-pack>
.RS 4
Path to the
\fIgit\-receive\-pack\fR
program on the remote end\&. Sometimes useful when pushing to a remote repository over ssh, and you do not have the program in a directory on the default $PATH\&.
.RE
.PP
\-\-exec=<git\-receive\-pack>
.RS 4
Same as \-\-receive\-pack=<git\-receive\-pack>\&.
.RE
.PP
\-\-all
.RS 4
Instead of explicitly specifying which refs to update, update all heads that locally exist\&.
.RE
.PP
\-\-dry\-run
.RS 4
Do everything except actually send the updates\&.
.RE
.PP
\-\-force
.RS 4
Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it\&. This flag disables the check\&. What this means is that the remote repository can lose commits; use it with care\&.
.RE
.PP
\-\-verbose
.RS 4
Run verbosely\&.
.RE
.PP
\-\-thin
.RS 4
Send a "thin" pack, which records objects in deltified form based on objects not included in the pack to reduce network traffic\&.
.RE
.PP
<host>
.RS 4
A remote host to house the repository\&. When this part is specified,
\fIgit\-receive\-pack\fR
is invoked via ssh\&.
.RE
.PP
<directory>
.RS 4
The repository to update\&.
.RE
.PP
<ref>\&...
.RS 4
The remote refs to update\&.
.RE
.SH "SPECIFYING THE REFS"
.sp
There are three ways to specify which refs to update on the remote end\&.
.sp
With \fI\-\-all\fR flag, all refs that exist locally are transferred to the remote side\&. You cannot specify any \fI<ref>\fR if you use this flag\&.
.sp
Without \fI\-\-all\fR and without any \fI<ref>\fR, the heads that exist both on the local side and on the remote side are updated\&.
.sp
When one or more \fI<ref>\fR are specified explicitly, it can be either a single pattern, or a pair of such pattern separated by a colon ":" (this means that a ref name cannot have a colon in it)\&. A single pattern \fI<name>\fR is just a shorthand for \fI<name>:<name>\fR\&.
.sp
Each pattern pair consists of the source side (before the colon) and the destination side (after the colon)\&. The ref to be pushed is determined by finding a match that matches the source side, and where it is pushed is determined by using the destination side\&. The rules used to match a ref are the same rules used by \fIgit rev\-parse\fR to resolve a symbolic ref name\&. See \fBgit-rev-parse\fR(1)\&.
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
It is an error if <src> does not match exactly one of the local refs\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
It is an error if <dst> matches more than one remote refs\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
If <dst> does not match any remote ref, either
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
it has to start with "refs/"; <dst> is used as the destination literally in this case\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
<src> == <dst> and the ref that matched the <src> must not exist in the set of remote refs; the ref matched <src> locally is used as the name of the destination\&.
.RE
.RE
.sp
Without \fI\-\-force\fR, the <src> ref is stored at the remote only if <dst> does not exist, or <dst> is a proper subset (i\&.e\&. an ancestor) of <src>\&. This check, known as "fast\-forward check", is performed in order to avoid accidentally overwriting the remote ref and lose other peoples\(aq commits from there\&.
.sp
With \fI\-\-force\fR, the fast\-forward check is disabled for all refs\&.
.sp
Optionally, a <ref> parameter can be prefixed with a plus \fI+\fR sign to disable the fast\-forward check only on that ref\&.
.SH "GIT"
.sp
Part of the \fBgit\fR(1) suite
