git-publish

Publish local directories to remote servers with ease using git + ssh.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.17">
<title>git-publish documentation</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>git-publish documentation</h1>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_quickstart">Quickstart</a></li>
<li><a href="#_setup">Setup</a>
<ul class="sectlevel2">
<li><a href="#_requirements">Requirements</a></li>
<li><a href="#_installing_git_publish">Installing git-publish</a></li>
<li><a href="#_additional_considerations">Additional Considerations</a></li>
</ul>
</li>
<li><a href="#_usage">Usage</a>
<ul class="sectlevel2">
<li><a href="#_initialize_publish_repository">Initialize Publish Repository</a></li>
<li><a href="#_create_publish_worktree">Create Publish Worktree</a></li>
<li><a href="#_publish_files_to_worktrees">Publish Files to Worktrees</a></li>
</ul>
</li>
<li><a href="#_git_publish1">git-publish(1)</a>
<ul class="sectlevel2">
<li><a href="#_synopsis">Synopsis</a></li>
<li><a href="#_options">Options</a></li>
<li><a href="#_commands">Commands</a></li>
<li><a href="#_exit_status">Exit status</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Publish to remote directories using <code>git</code> + <code>ssh</code>.</p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title="Warning"></i>
</td>
<td class="content">
This document is for the dev version and as such is a WIP&#8201;&#8212;&#8201;some
information may be missing or inaccurate. You can find the original version of
this document <a href="https://rex.mckinnon.ninja/git-publish">here</a>.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_quickstart">Quickstart</h2>
<div class="sectionbody">
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Init</strong>ialize a <em>publish repository</em>. This creates a bare repository on <code>host</code>
at <code>remote_path</code> and clones it to <code>local_path</code> (default <code>./&lt;remote_name&gt;</code>). It
also creates an initial commit with the message 'Init Version 0'.</p>
<div class="literalblock">
<div class="content">
<pre>$ git publish init &lt;host&gt;:&lt;remote_path&gt; [local_path]</pre>
</div>
</div>
</li>
<li>
<p>Add a <em>publish <strong>worktree</strong></em>. This creates a directory on the publish
server (default <code>origin</code>) that will stay in sync with a branch (default <code>master</code>
or <code>init.defaultBranch</code> if set).</p>
<div class="literalblock">
<div class="content">
<pre>$ git publish worktree &lt;remote_path&gt; [local_path]</pre>
</div>
</div>
</li>
<li>
<p>Edit files, and <strong><em>publish</em></strong> to a remote repository (default <code>origin</code>). An optional
commit message can be used instead of the default. A custom commit message has
to be set only once, as if no message is given the last commit message is used
with an incremented version number.</p>
<div class="literalblock">
<div class="content">
<pre>$ touch index.html
$ git publish [-m "Custom Message"]</pre>
</div>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_setup">Setup</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Currently, the required software has to be installed manually.<br>
A install script is provided to install <code>git-publish</code> and it&#8217;s documentation.</p>
</div>
<div class="sect2">
<h3 id="_requirements">Requirements</h3>
<div class="paragraph">
<p>Only a few common programs are required to use <code>git-publish</code>. They can
typically be installed with your distro&#8217;s package manager.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><code>git</code></dt>
<dd>
<p>git is required for, well, the <code>git</code> command. It&#8217;s required to be installed on
both your local machine and the remote server.</p>
</dd>
<dt class="hdlist1"><code>ssh</code></dt>
<dd>
<p>ssh is required for running commands on the remote server and pulling from git
repositories. It will also need to be installed on both the local machine and
the remote server. The remote server should be running an ssh server that is
accessible from the local machine.</p>
</dd>
<dt class="hdlist1"><code>bash</code></dt>
<dd>
<p>Currently, the <code>git-publish</code> script uses a few "bashism"s, it is not guaranteed
to run in other shells. Because of this, <code>bash</code> is listed as a requirement,
however it may work in others.</p>
</dd>
</dl>
</div>
</div>
<div class="sect2">
<h3 id="_installing_git_publish">Installing git-publish</h3>
<div class="paragraph">
<p><code>git-publish</code> is available on <a href="https://github.com/Rex--/git-publish/tree/dev">github</a>. Clone the repo
to get started, then chose from an automatic install script or manual
installation of the software.</p>
</div>
<div class="sect3">
<h4 id="_installation_script">Installation script</h4>
<div class="paragraph">
<p>An installation script is provided that copies the needed files to the
appropriate directories. You can run this script with make using <code>make install</code>
or run the script independently with <code>./install.sh</code>.</p>
</div>
<div class="paragraph">
<p>The script will prompt for you to choose a directory on your $PATH to copy the
<code>git-publish</code> script to. It will the copy the <code>git-publish.1</code> man page to the
first path returned from the <code>manpath</code> command. You will need write access to
both directories!</p>
</div>
<div class="literalblock">
<div class="title">Running the install.sh script</div>
<div class="content">
<pre>$ sudo make install
[sudo] password for user:
Select an install directory on your $PATH:
 (1) /usr/local/bin [default]
 (2) /usr/bin
 (3) /bin
 (4) /usr/local/sbin
 (5) /usr/lib/jvm/default/bin
 (6) /opt/microchip/xc8/v2.40/bin
 (7) /home/user/.local/bin/
Input a number (enter for default):
Installing 'git-publish' to '/usr/local/bin' -- success
Installing 'docs/git-publish.1' to '/usr/local/man' -- success
Successfully installed git-publish.</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_manual_installation">Manual Installation</h4>
<div class="paragraph">
<p>To install the <code>git publish</code> command manually, simply place the script
somewhere it is available on your $PATH and mark it executable.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ cp git-publish ~/.local/bin
$ chmod a+x ~/.local/bin/git-publish</pre>
</div>
</div>
<div class="paragraph">
<p>Alternatively to stay up-to-date with the latest release, link directly to the
git repository. It&#8217;s recommended to checkout a tag or a commit in this case.</p>
</div>
<div class="literalblock">
<div class="title">The following has not been tested</div>
<div class="content">
<pre>$ git checkout --detach master
$ ln -s git-publish ~/.local/bin
$ chmod a+x git-publish</pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_additional_considerations">Additional Considerations</h3>
<div class="sect3">
<h4 id="_git">&#46;git</h4>
<div class="paragraph">
<p>Because we create a linked worktree to an existing repo, <code>.git</code> is a file
that contains a path to the common repo. This might expose sensitive
information e.g. if serving the directory with a web server. An example <code>.git</code>
created with the publish command contains the following:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>gitdir: /git/website.git/worktrees/example</pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_linux_file_permissions">Linux File Permissions</h4>
<div class="paragraph">
<p>The ssh user that you use to connect with git needs to have write permissions
to both the bare repository and the publish directory. An example setup is
a <code>publish</code> group that has <strong>rwx</strong> permissions to each parent directory.
The example below will give the <code>git</code> user appropriate permissions to push to a
repository at <code>&lt;server&gt;:/srv/git/example.git</code> and publish files in
<code>/srv/publish/example</code>. Additional users can be granted permissions by adding
them to the <code>publish</code> group.</p>
</div>
<div class="literalblock">
<div class="content">
<pre># mkdir /srv/git /srv/publish
# groupadd publish
# chgrp publish /srv/git /srv/publish
# chmod g+w /srv/git /srv/publish
# usermod -aG publish git</pre>
</div>
</div>
<div class="paragraph">
<p>Alternatively, you could just work in the user&#8217;s home directory:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ mkdir ~/git ~/publish</pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<code>git publish</code> requires absolute paths for all arguments that take a path.
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_ssh_host">SSH Host</h4>
<div class="paragraph">
<p>The publish server is required to be accessible over ssh. This means we have to
authenticate with it somehow, however, most of the time it is recommend to
disable password logins for security. The easiest way to authenticate using a
key pair is by installing the needed key to your <code>ssh-agent</code>. This also means
you won&#8217;t have to type in any passwords to login to the publish server.</p>
</div>
<div class="paragraph">
<p>Sometimes, you may not have an ssh-agent running or maybe you are running the
server on a non-standard port. These situations require you to configure the
ssh connection. The current recommended way to do this is by editing
<code>~/.ssh/config</code> and configuring a custom host for your ssh server. An
example of one such host is given below:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>Host &lt;custom-host&gt;
    Hostname       &lt;ip&gt;
    Port           &lt;port&gt;
    User           &lt;user&gt;
    IdentityFile   &lt;path/to/private_key&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>All configuration options are optional, just use what you need to change from
the defaults. You can now use <code>&lt;custom-host&gt;</code> as a hostname like:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>$ git publish init &lt;custom-host&gt;:/path/to/repo.git</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_usage">Usage</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The basic workflow this suits is to keep a remote directory in sync with
one on your local machine. It achieves this by pushing a local repository to a
remote repository over ssh. This means an intermediate git host such as Github
is not required. A git server hook that fires after a successful push is used
to trigger a force checkout of the main branch for every published worktree
on the server. These worktree directories contain a copy of the latest
committed files.</p>
</div>
<div class="sect2">
<h3 id="_initialize_publish_repository">Initialize Publish Repository</h3>
<div class="paragraph">
<p>When you initialize a repository with the <code>git publish init</code> command, it does
three main things:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Creates a bare repository on the given host and installs a post-receive hook.</p>
</li>
<li>
<p>Initializes a local repository and adds the remote as origin.</p>
</li>
<li>
<p>Creates an empty commit and pushes it to the configured branch.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Let&#8217;s initialize a publish repository on <code>example.com</code>. We&#8217;ll call it <code>website</code>.</p>
</div>
<div class="exampleblock">
<div class="title">Example 1. Initializing a publish repository</div>
<div class="content">
<div class="literalblock">
<div class="content">
<pre>$ git publish init example.com:/git/website.git
Connecting to server: example.com
Repo: /git/website.git
[email protected]'s password:
Initialized empty Git repository in /git/website.git/
Find this repo at: example.com:/git/website.git
Cloning into local directory: website/
Initialized empty Git repository in /home/user/website/.git/
[master (root-commit) aa3d154] Init Version 0
[email protected]'s password:
Enumerating objects: 2, done.
Counting objects: 100% (2/2), done.
Writing objects: 100% (2/2), 170 bytes | 170.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
To example.com:/git/website.git
 * [new branch]      master -&gt; master</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>This created two repositories: <code>/git/website.git</code> on our server and
<code>website/.git</code> on our local machine.</p>
</div>
<div class="paragraph">
<p>Inside of our local repo, if we run <code>git remote get-url origin</code> (or whatever
you set the remote to be) we can see it is set up to push/pull from
<code>example.com:/git/website.git</code>. The git-publish command just runs a <code>git init</code>
and then <code>git remote add</code> to setup the local repository. It then creates an
empty commit and pushes it to the remote with the message 'Init Version 0'.
This empty commit can be viewed as the 'creation' commit.</p>
</div>
<div class="paragraph">
<p>In our server repo, the only interesting thing you will find is a shell script
<code>post-receive</code> that gets installed in <code>&lt;repo&gt;/hooks/</code> e.g.
<code>example.git/hooks/post-receive</code> in the case of the example above. This script,
which runs after a successful push, simply finds all *.publish files in the
hooks/ directory and executes them. Other than this simple one-line script, the
bare repository is bog standard.</p>
</div>
</div>
<div class="sect2">
<h3 id="_create_publish_worktree">Create Publish Worktree</h3>
<div class="paragraph">
<p>The worktree(s) that hold the actual published files are created with the
<code>git publish worktree</code> command.</p>
</div>
<div class="paragraph">
<p>Let&#8217;s create a publish worktree on <code>example.com</code> at <code>/var/www/website/</code>. Note
how we don&#8217;t have to specify a host like <code>example.com</code>, it is extracted from
the configured remote (default <code>origin</code>).</p>
</div>
<div class="exampleblock">
<div class="title">Example 2. Create a publish worktree</div>
<div class="content">
<div class="literalblock">
<div class="content">
<pre>$ git publish worktree /var/www/example
Using remote 'origin' @ example.com:/git/website.git
Creating publish worktree: /var/www/example
[email protected]'s password:
Preparing worktree (detached HEAD cf7f00d)
HEAD is now at cf7f00d Init Version 0
Successfully created worktree: /var/www/example</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>This created a new linked worktree at <code>/var/www/example</code> and checked out the
latest commit in the configured branch. If you haven&#8217;t yet published any files,
the directory will be empty except for the <code>.git</code> <em>file</em>. Refer to the
<a href="#_git">.git section</a> in <a href="#_additional_considerations">Additional Considerations</a> for info about this file.</p>
</div>
<div class="paragraph">
<p>This command also places a <code>.publish</code> script into the common repository&#8217;s
<code>hook/</code> directory. This script contains the worktree path and the branch to
stay up-to-date with. The file is named after the worktree path, so the
example worktree&#8217;s script would be <code>var-www-example.publish</code>. This script gets
run on every successful push and checks out the latest commit in the configured
branch. There is currently no way to change the branch a worktree tracks.</p>
</div>
</div>
<div class="sect2">
<h3 id="_publish_files_to_worktrees">Publish Files to Worktrees</h3>
<div class="paragraph">
<p>Files are published to remote worktrees with the <code>git publish</code> command. Most of
the time, no arguments are required.</p>
</div>
<div class="paragraph">
<p>Let&#8217;s publish an <code>index.html</code> to our <code>/var/www/example/</code>.</p>
</div>
<div class="exampleblock">
<div class="title">Example 3. Publish a file</div>
<div class="content">
<div class="literalblock">
<div class="content">
<pre>$ touch index.html
$ git publish index.html
Publishing files: index.html
Using default commit message: Publish Version
Using default version: 1
[master 3e9a0d8] Publish Version 1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 index.html
[email protected]'s password:
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 259 bytes | 259.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Updating worktree: /var/www/example
remote: HEAD is now at 3e9a0d8 Publish Version 1
To example.com:/git/website.git
   cf7f00d..3e9a0d8  master -&gt; master
Published Version: 1</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>This published the specified files, and then checked out the commit in the
remote worktree. Because this was our first commit (the previous commit&#8217;s
version was 0) and no message was specified with <code>-m</code>, the commit message
defaults to 'Publish Version' plus the version appended to the end. Note how
this changes in the example below.</p>
</div>
<div class="paragraph">
<p>Now, let&#8217;s add some error pages.</p>
</div>
<div class="exampleblock">
<div class="title">Example 4. Publish a directory</div>
<div class="content">
<div class="literalblock">
<div class="content">
<pre>$ touch 404.html 403.html
$ git publish
Publishing directory: /home/user/website
Using last commit message: Publish Version 1
Incrementing commit version: 1 + 1
[master dedbeef] Publish Version 2
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 404.html
 create mode 100644 403.html
[email protected]'s password:
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 259 bytes | 259.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Updating worktree: /var/www/example
remote: HEAD is now at 3e9a0d8 Publish Version 2
To example.com:/git/website.git
   cf7f00d..3e9a0d8  master -&gt; master
Published Version: 2</pre>
</div>
</div>
</div>
</div>
<div class="paragraph">
<p>Since we didn&#8217;t specify any files to publish, it publishes every file in the
directory. No commit message was specified, so it defaults to the last commit
message with an incremented version number.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_git_publish1">git-publish(1)</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_synopsis">Synopsis</h3>
<div class="paragraph">
<p><strong>git publish [init|worktree] [-r remote] [-b branch] [-m message]
[files|host:remote_path|remote_path] [local_path]</strong></p>
</div>
<div class="paragraph">
<p><strong>git publish [-r] [-b] [-m message] [files]</strong><br>
<strong>git publish init [-r] [-b] host:remote_path [local_path]</strong><br>
<strong>git publish worktree [-r] [-b] [-d] remote_path</strong><br></p>
</div>
</div>
<div class="sect2">
<h3 id="_options">Options</h3>
<div class="paragraph">
<p>All commands accept some common configuration options in case you&#8217;d like to
change the defaults. All dashed arguments should come <em>before</em> any positional
arguments and <em>after</em> the subcommand.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>-r remote</strong></dt>
<dd>
<p>The name of the remote to perform the publish operation on.
(Default <em>origin</em>)</p>
</dd>
<dt class="hdlist1"><strong>-b branch</strong></dt>
<dd>
<p>The name of the branch to perform the publish operation on.
(Default <em>master</em> or <em>init.defaultBranch</em> if set)</p>
</dd>
</dl>
</div>
</div>
<div class="sect2">
<h3 id="_commands">Commands</h3>
<div class="paragraph">
<p>When run with no arguments, it will publish all files in the repository to
<em>&lt;remote&gt;/&lt;branch&gt;</em>. Any worktrees that are on <em>&lt;remote&gt;</em> and are configured to
track <em>&lt;branch&gt;</em> will get updated.<br>
Note that all <em>remote_path</em> arguments <strong>MUST</strong> be absolute paths.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>publish</strong></dt>
<dd>
<p>Publish <em>files</em> to <em>&lt;remote&gt;/&lt;branch&gt;</em>. Any worktrees that have been created on
<em>origin</em> will be updated.</p>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>-m message</strong></dt>
<dd>
<p>Commit message to use. If no version is found in the message,
one will be appended to the end. (Default: Last commit if exists, else
"Publish Version")</p>
</dd>
<dt class="hdlist1"><strong>files</strong></dt>
<dd>
<p>List of files to publish. (Default: <em>-A</em> All files)</p>
</dd>
</dl>
</div>
</dd>
<dt class="hdlist1"><strong>publish init</strong></dt>
<dd>
<p>Initialize a repository on <em>host</em> at <em>remote_path</em> and link it with
<em>local_path</em>.</p>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>host</strong></dt>
<dd>
<p>Remote host url. Accepts <em>[user@]host</em> and
<em>ssh://[user@]host[:port]</em> formats.</p>
</dd>
<dt class="hdlist1"><strong>remote_path</strong></dt>
<dd>
<p>Absolute path of the bare git repository on <em>host</em>.
e.g. <em>/git/something-like.git</em></p>
</dd>
<dt class="hdlist1"><strong>local_path</strong></dt>
<dd>
<p>Optional path to the local repository. (Default: Create a
directory with the remote repository&#8217;s name e.g. <em>./something-like/</em>)</p>
</dd>
</dl>
</div>
</dd>
<dt class="hdlist1"><strong>publish worktree</strong></dt>
<dd>
<p>Create a new worktree on <em>&lt;remote&gt;</em> at <em>remote_path</em> that gets updated on every
push to <em>&lt;branch&gt;</em>. If the -d flag is specified, delete an existing worktree.</p>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>-d</strong></dt>
<dd>
<p>Delete an existing worktree instead of creating a new one.</p>
</dd>
<dt class="hdlist1"><strong>remote_path</strong></dt>
<dd>
<p>Absolute path of worktree on the remote.</p>
</dd>
</dl>
</div>
</dd>
</dl>
</div>
</div>
<div class="sect2">
<h3 id="_exit_status">Exit status</h3>
<div class="dlist">
<dl>
<dt class="hdlist1"><strong>0</strong></dt>
<dd>
<p>Success.<br>
The program thinks everything was successful (you be the judge).</p>
</dd>
<dt class="hdlist1"><strong>1</strong></dt>
<dd>
<p>Error.<br>
An error occurred, probably an invalid argument or git operation.</p>
</dd>
</dl>
</div>
<hr>
<div class="paragraph text-center">
<p><span class="big"><a href="https://github.com/Rex--/git-publish/tree/dev">github</a> | <a href="https://rex.mckinnon.ninja/git-publish-dev">documentation</a></span><br>
&copy; 2022 Rex McKinnon</p>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2022-10-25 20:19:07 -0700
</div>
</div>
</body>
</html>