blob: 802c93880cabd7df98ed5ef2b584684eee07be37 [file] [log] [blame]
Junio C Hamano944ce252018-05-30 22:25:261<?xml version="1.0" encoding="UTF-8"?>
Junio C Hamanof2b74942012-11-20 21:06:262<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5<head>
Junio C Hamano9d971152012-12-19 00:43:116<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
Junio C Hamanoa85030a2022-07-27 16:48:217<meta name="generator" content="AsciiDoc 10.2.0" />
Junio C Hamano076ffcc2013-02-06 05:13:218<title>How to setup Git server over http</title>
Junio C Hamanof2b74942012-11-20 21:06:269<style type="text/css">
Junio C Hamano9d971152012-12-19 00:43:1110/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
11
12/* Default font. */
13body {
14 font-family: Georgia,serif;
15}
16
17/* Title font. */
18h1, h2, h3, h4, h5, h6,
19div.title, caption.title,
20thead, p.table.header,
21#toctitle,
22#author, #revnumber, #revdate, #revremark,
23#footer {
24 font-family: Arial,Helvetica,sans-serif;
Junio C Hamanof2b74942012-11-20 21:06:2625}
26
27body {
28 margin: 1em 5% 1em 5%;
29}
30
31a {
32 color: blue;
33 text-decoration: underline;
34}
35a:visited {
36 color: fuchsia;
37}
38
39em {
40 font-style: italic;
41 color: navy;
42}
43
44strong {
45 font-weight: bold;
46 color: #083194;
47}
48
Junio C Hamanof2b74942012-11-20 21:06:2649h1, h2, h3, h4, h5, h6 {
50 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:2651 margin-top: 1.2em;
52 margin-bottom: 0.5em;
53 line-height: 1.3;
54}
55
56h1, h2, h3 {
57 border-bottom: 2px solid silver;
58}
59h2 {
60 padding-top: 0.5em;
61}
62h3 {
63 float: left;
64}
65h3 + * {
66 clear: left;
67}
Junio C Hamano9d971152012-12-19 00:43:1168h5 {
69 font-size: 1.0em;
70}
Junio C Hamanof2b74942012-11-20 21:06:2671
72div.sectionbody {
Junio C Hamanof2b74942012-11-20 21:06:2673 margin-left: 0;
74}
75
76hr {
77 border: 1px solid silver;
78}
79
80p {
81 margin-top: 0.5em;
82 margin-bottom: 0.5em;
83}
84
85ul, ol, li > p {
86 margin-top: 0;
87}
Junio C Hamano9d971152012-12-19 00:43:1188ul > li { color: #aaa; }
89ul > li > * { color: black; }
Junio C Hamanof2b74942012-11-20 21:06:2690
Junio C Hamanoc14e6ad2014-10-31 20:25:5391.monospaced, code, pre {
92 font-family: "Courier New", Courier, monospace;
93 font-size: inherit;
94 color: navy;
Junio C Hamanof2b74942012-11-20 21:06:2695 padding: 0;
96 margin: 0;
97}
Junio C Hamanoc14e6ad2014-10-31 20:25:5398pre {
99 white-space: pre-wrap;
100}
Junio C Hamanof2b74942012-11-20 21:06:26101
Junio C Hamano9d971152012-12-19 00:43:11102#author {
Junio C Hamanof2b74942012-11-20 21:06:26103 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26104 font-weight: bold;
105 font-size: 1.1em;
106}
Junio C Hamano9d971152012-12-19 00:43:11107#email {
Junio C Hamanof2b74942012-11-20 21:06:26108}
Junio C Hamano9d971152012-12-19 00:43:11109#revnumber, #revdate, #revremark {
Junio C Hamanof2b74942012-11-20 21:06:26110}
111
Junio C Hamano9d971152012-12-19 00:43:11112#footer {
Junio C Hamanof2b74942012-11-20 21:06:26113 font-size: small;
114 border-top: 2px solid silver;
115 padding-top: 0.5em;
116 margin-top: 4.0em;
117}
Junio C Hamano9d971152012-12-19 00:43:11118#footer-text {
Junio C Hamanof2b74942012-11-20 21:06:26119 float: left;
120 padding-bottom: 0.5em;
121}
Junio C Hamano9d971152012-12-19 00:43:11122#footer-badges {
Junio C Hamanof2b74942012-11-20 21:06:26123 float: right;
124 padding-bottom: 0.5em;
125}
126
Junio C Hamano9d971152012-12-19 00:43:11127#preamble {
Junio C Hamanof2b74942012-11-20 21:06:26128 margin-top: 1.5em;
129 margin-bottom: 1.5em;
130}
Junio C Hamano9d971152012-12-19 00:43:11131div.imageblock, div.exampleblock, div.verseblock,
Junio C Hamanof2b74942012-11-20 21:06:26132div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133div.admonitionblock {
134 margin-top: 1.0em;
135 margin-bottom: 1.5em;
136}
137div.admonitionblock {
138 margin-top: 2.0em;
139 margin-bottom: 2.0em;
140 margin-right: 10%;
141 color: #606060;
142}
143
144div.content { /* Block element content. */
145 padding: 0;
146}
147
148/* Block element titles. */
149div.title, caption.title {
150 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26151 font-weight: bold;
152 text-align: left;
153 margin-top: 1.0em;
154 margin-bottom: 0.5em;
155}
156div.title + * {
157 margin-top: 0;
158}
159
160td div.title:first-child {
161 margin-top: 0.0em;
162}
163div.content div.title:first-child {
164 margin-top: 0.0em;
165}
166div.content + div.title {
167 margin-top: 0.0em;
168}
169
170div.sidebarblock > div.content {
171 background: #ffffee;
Junio C Hamano9d971152012-12-19 00:43:11172 border: 1px solid #dddddd;
173 border-left: 4px solid #f0f0f0;
Junio C Hamanof2b74942012-11-20 21:06:26174 padding: 0.5em;
175}
176
177div.listingblock > div.content {
Junio C Hamano9d971152012-12-19 00:43:11178 border: 1px solid #dddddd;
179 border-left: 5px solid #f0f0f0;
180 background: #f8f8f8;
Junio C Hamanof2b74942012-11-20 21:06:26181 padding: 0.5em;
182}
183
184div.quoteblock, div.verseblock {
185 padding-left: 1.0em;
186 margin-left: 1.0em;
187 margin-right: 10%;
Junio C Hamano9d971152012-12-19 00:43:11188 border-left: 5px solid #f0f0f0;
189 color: #888;
Junio C Hamanof2b74942012-11-20 21:06:26190}
191
192div.quoteblock > div.attribution {
193 padding-top: 0.5em;
194 text-align: right;
195}
196
Junio C Hamano9d971152012-12-19 00:43:11197div.verseblock > pre.content {
198 font-family: inherit;
199 font-size: inherit;
Junio C Hamanof2b74942012-11-20 21:06:26200}
201div.verseblock > div.attribution {
202 padding-top: 0.75em;
203 text-align: left;
204}
205/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
206div.verseblock + div.attribution {
207 text-align: left;
208}
209
210div.admonitionblock .icon {
211 vertical-align: top;
212 font-size: 1.1em;
213 font-weight: bold;
214 text-decoration: underline;
215 color: #527bbd;
216 padding-right: 0.5em;
217}
218div.admonitionblock td.content {
219 padding-left: 0.5em;
220 border-left: 3px solid #dddddd;
221}
222
223div.exampleblock > div.content {
224 border-left: 3px solid #dddddd;
225 padding-left: 0.5em;
226}
227
228div.imageblock div.content { padding-left: 0; }
Junio C Hamanoc14e6ad2014-10-31 20:25:53229span.image img { border-style: none; vertical-align: text-bottom; }
Junio C Hamanof2b74942012-11-20 21:06:26230a.image:visited { color: white; }
231
232dl {
233 margin-top: 0.8em;
234 margin-bottom: 0.8em;
235}
236dt {
237 margin-top: 0.5em;
238 margin-bottom: 0;
239 font-style: normal;
240 color: navy;
241}
242dd > *:first-child {
243 margin-top: 0.1em;
244}
245
246ul, ol {
247 list-style-position: outside;
248}
249ol.arabic {
250 list-style-type: decimal;
251}
252ol.loweralpha {
253 list-style-type: lower-alpha;
254}
255ol.upperalpha {
256 list-style-type: upper-alpha;
257}
258ol.lowerroman {
259 list-style-type: lower-roman;
260}
261ol.upperroman {
262 list-style-type: upper-roman;
263}
264
265div.compact ul, div.compact ol,
266div.compact p, div.compact p,
267div.compact div, div.compact div {
268 margin-top: 0.1em;
269 margin-bottom: 0.1em;
270}
271
Junio C Hamanof2b74942012-11-20 21:06:26272tfoot {
273 font-weight: bold;
274}
275td > div.verse {
276 white-space: pre;
277}
Junio C Hamanof2b74942012-11-20 21:06:26278
279div.hdlist {
280 margin-top: 0.8em;
281 margin-bottom: 0.8em;
282}
283div.hdlist tr {
284 padding-bottom: 15px;
285}
286dt.hdlist1.strong, td.hdlist1.strong {
287 font-weight: bold;
288}
289td.hdlist1 {
290 vertical-align: top;
291 font-style: normal;
292 padding-right: 0.8em;
293 color: navy;
294}
295td.hdlist2 {
296 vertical-align: top;
297}
298div.hdlist.compact tr {
299 margin: 0;
300 padding-bottom: 0;
301}
302
303.comment {
304 background: yellow;
305}
306
307.footnote, .footnoteref {
308 font-size: 0.8em;
309}
310
311span.footnote, span.footnoteref {
312 vertical-align: super;
313}
314
315#footnotes {
316 margin: 20px 0 20px 0;
317 padding: 7px 0 0 0;
318}
319
320#footnotes div.footnote {
321 margin: 0 0 5px 0;
322}
323
324#footnotes hr {
325 border: none;
326 border-top: 1px solid silver;
327 height: 1px;
328 text-align: left;
329 margin-left: 0;
330 width: 20%;
331 min-width: 100px;
332}
333
Junio C Hamano9d971152012-12-19 00:43:11334div.colist td {
335 padding-right: 0.5em;
336 padding-bottom: 0.3em;
337 vertical-align: top;
338}
339div.colist td img {
340 margin-top: 0.3em;
Junio C Hamanof2b74942012-11-20 21:06:26341}
342
Junio C Hamano9d971152012-12-19 00:43:11343@media print {
344 #footer-badges { display: none; }
345}
346
347#toc {
Junio C Hamanof2b74942012-11-20 21:06:26348 margin-bottom: 2.5em;
349}
350
Junio C Hamano9d971152012-12-19 00:43:11351#toctitle {
Junio C Hamanof2b74942012-11-20 21:06:26352 color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26353 font-size: 1.1em;
354 font-weight: bold;
355 margin-top: 1.0em;
356 margin-bottom: 0.1em;
357}
358
Junio C Hamanoc14e6ad2014-10-31 20:25:53359div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
Junio C Hamanof2b74942012-11-20 21:06:26360 margin-top: 0;
361 margin-bottom: 0;
362}
363div.toclevel2 {
364 margin-left: 2em;
365 font-size: 0.9em;
366}
367div.toclevel3 {
368 margin-left: 4em;
369 font-size: 0.9em;
370}
371div.toclevel4 {
372 margin-left: 6em;
373 font-size: 0.9em;
374}
Junio C Hamanof2b74942012-11-20 21:06:26375
Junio C Hamano9d971152012-12-19 00:43:11376span.aqua { color: aqua; }
377span.black { color: black; }
378span.blue { color: blue; }
379span.fuchsia { color: fuchsia; }
380span.gray { color: gray; }
381span.green { color: green; }
382span.lime { color: lime; }
383span.maroon { color: maroon; }
384span.navy { color: navy; }
385span.olive { color: olive; }
386span.purple { color: purple; }
387span.red { color: red; }
388span.silver { color: silver; }
389span.teal { color: teal; }
390span.white { color: white; }
391span.yellow { color: yellow; }
392
393span.aqua-background { background: aqua; }
394span.black-background { background: black; }
395span.blue-background { background: blue; }
396span.fuchsia-background { background: fuchsia; }
397span.gray-background { background: gray; }
398span.green-background { background: green; }
399span.lime-background { background: lime; }
400span.maroon-background { background: maroon; }
401span.navy-background { background: navy; }
402span.olive-background { background: olive; }
403span.purple-background { background: purple; }
404span.red-background { background: red; }
405span.silver-background { background: silver; }
406span.teal-background { background: teal; }
407span.white-background { background: white; }
408span.yellow-background { background: yellow; }
409
410span.big { font-size: 2em; }
411span.small { font-size: 0.6em; }
412
413span.underline { text-decoration: underline; }
414span.overline { text-decoration: overline; }
415span.line-through { text-decoration: line-through; }
416
Junio C Hamanoc14e6ad2014-10-31 20:25:53417div.unbreakable { page-break-inside: avoid; }
418
Junio C Hamano9d971152012-12-19 00:43:11419
420/*
421 * xhtml11 specific
422 *
423 * */
424
425div.tableblock {
426 margin-top: 1.0em;
427 margin-bottom: 1.5em;
Junio C Hamanof2b74942012-11-20 21:06:26428}
Junio C Hamano9d971152012-12-19 00:43:11429div.tableblock > table {
430 border: 3px solid #527bbd;
431}
432thead, p.table.header {
Junio C Hamanof2b74942012-11-20 21:06:26433 font-weight: bold;
Junio C Hamano9d971152012-12-19 00:43:11434 color: #527bbd;
435}
436p.table {
437 margin-top: 0;
438}
Junio C Hamano725b0da2020-01-22 22:02:40439/* Because the table frame attribute is overridden by CSS in most browsers. */
Junio C Hamano9d971152012-12-19 00:43:11440div.tableblock > table[frame="void"] {
441 border-style: none;
442}
443div.tableblock > table[frame="hsides"] {
444 border-left-style: none;
445 border-right-style: none;
446}
447div.tableblock > table[frame="vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
Junio C Hamanof2b74942012-11-20 21:06:26450}
451
Junio C Hamano9d971152012-12-19 00:43:11452
453/*
454 * html5 specific
455 *
456 * */
457
458table.tableblock {
459 margin-top: 1.0em;
460 margin-bottom: 1.5em;
461}
462thead, p.tableblock.header {
463 font-weight: bold;
464 color: #527bbd;
465}
466p.tableblock {
467 margin-top: 0;
468}
469table.tableblock {
470 border-width: 3px;
471 border-spacing: 0px;
472 border-style: solid;
473 border-color: #527bbd;
474 border-collapse: collapse;
475}
476th.tableblock, td.tableblock {
477 border-width: 1px;
478 padding: 4px;
479 border-style: solid;
480 border-color: #527bbd;
Junio C Hamanof2b74942012-11-20 21:06:26481}
482
Junio C Hamano9d971152012-12-19 00:43:11483table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
486}
487table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
490}
491table.tableblock.frame-none {
492 border-style: hidden;
493}
494
495th.tableblock.halign-left, td.tableblock.halign-left {
496 text-align: left;
497}
498th.tableblock.halign-center, td.tableblock.halign-center {
499 text-align: center;
500}
501th.tableblock.halign-right, td.tableblock.halign-right {
Junio C Hamanof2b74942012-11-20 21:06:26502 text-align: right;
503}
504
Junio C Hamano9d971152012-12-19 00:43:11505th.tableblock.valign-top, td.tableblock.valign-top {
506 vertical-align: top;
Junio C Hamanof2b74942012-11-20 21:06:26507}
Junio C Hamano9d971152012-12-19 00:43:11508th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
510}
511th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
Junio C Hamanof2b74942012-11-20 21:06:26513}
514
Junio C Hamano9d971152012-12-19 00:43:11515
516/*
517 * manpage specific
518 *
519 * */
520
521body.manpage h1 {
522 padding-top: 0.5em;
523 padding-bottom: 0.5em;
524 border-top: 2px solid silver;
525 border-bottom: 2px solid silver;
526}
527body.manpage h2 {
528 border-style: none;
529}
530body.manpage div.sectionbody {
531 margin-left: 3em;
Junio C Hamanof2b74942012-11-20 21:06:26532}
533
Junio C Hamano9d971152012-12-19 00:43:11534@media print {
535 body.manpage div#toc { display: none; }
536}
Junio C Hamanoc14e6ad2014-10-31 20:25:53537
538
Junio C Hamanof2b74942012-11-20 21:06:26539</style>
540<script type="text/javascript">
541/*<![CDATA[*/
Junio C Hamano2b153182021-12-15 21:00:31542var asciidoc = { // Namespace.
543
544/////////////////////////////////////////////////////////////////////
545// Table Of Contents generator
546/////////////////////////////////////////////////////////////////////
547
548/* Author: Mihai Bazon, September 2002
549 * http://students.infoiasi.ro/~mishoo
550 *
551 * Table Of Content generator
552 * Version: 0.4
553 *
554 * Feel free to use this script under the terms of the GNU General Public
555 * License, as long as you do not remove or alter this notice.
556 */
557
558 /* modified by Troy D. Hanson, September 2006. License: GPL */
559 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
560
561// toclevels = 1..4.
562toc: function (toclevels) {
563
564 function getText(el) {
565 var text = "";
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
568 text += i.data;
569 else if (i.firstChild != null)
570 text += getText(i);
571 }
572 return text;
573 }
574
575 function TocEntry(el, text, toclevel) {
576 this.element = el;
577 this.text = text;
578 this.toclevel = toclevel;
579 }
580
581 function tocEntries(el, toclevels) {
582 var result = new Array;
583 var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
584 // Function that scans the DOM tree for header elements (the DOM2
585 // nodeIterator API would be a better technique but not supported by all
586 // browsers).
587 var iterate = function (el) {
588 for (var i = el.firstChild; i != null; i = i.nextSibling) {
589 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
590 var mo = re.exec(i.tagName);
591 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
592 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
593 }
594 iterate(i);
595 }
596 }
597 }
598 iterate(el);
599 return result;
600 }
601
602 var toc = document.getElementById("toc");
603 if (!toc) {
604 return;
605 }
606
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
609 var i;
610 for (i = 0; i < toc.childNodes.length; i++) {
611 var entry = toc.childNodes[i];
612 if (entry.nodeName.toLowerCase() == 'div'
613 && entry.getAttribute("class")
614 && entry.getAttribute("class").match(/^toclevel/))
615 tocEntriesToRemove.push(entry);
616 }
617 for (i = 0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
619 }
620
621 // Rebuild TOC entries.
622 var entries = tocEntries(document.getElementById("content"), toclevels);
623 for (var i = 0; i < entries.length; ++i) {
624 var entry = entries[i];
625 if (entry.element.id == "")
626 entry.element.id = "_toc_" + i;
627 var a = document.createElement("a");
628 a.href = "#" + entry.element.id;
629 a.appendChild(document.createTextNode(entry.text));
630 var div = document.createElement("div");
631 div.appendChild(a);
632 div.className = "toclevel" + entry.toclevel;
633 toc.appendChild(div);
634 }
635 if (entries.length == 0)
636 toc.parentNode.removeChild(toc);
637},
638
639
640/////////////////////////////////////////////////////////////////////
641// Footnotes generator
642/////////////////////////////////////////////////////////////////////
643
644/* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
646 */
647
648footnotes: function () {
649 // Delete existing footnote entries in case we're reloading the footnodes.
650 var i;
651 var noteholder = document.getElementById("footnotes");
652 if (!noteholder) {
653 return;
654 }
655 var entriesToRemove = [];
656 for (i = 0; i < noteholder.childNodes.length; i++) {
657 var entry = noteholder.childNodes[i];
658 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
659 entriesToRemove.push(entry);
660 }
661 for (i = 0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
663 }
664
665 // Rebuild footnote entries.
666 var cont = document.getElementById("content");
667 var spans = cont.getElementsByTagName("span");
668 var refs = {};
669 var n = 0;
670 for (i=0; i<spans.length; i++) {
671 if (spans[i].className == "footnote") {
672 n++;
673 var note = spans[i].getAttribute("data-note");
674 if (!note) {
675 // Use [\s\S] in place of . so multi-line matches work.
676 // Because JavaScript has no s (dotall) regex flag.
677 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
678 spans[i].innerHTML =
679 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
680 "' title='View footnote' class='footnote'>" + n + "</a>]";
681 spans[i].setAttribute("data-note", note);
682 }
683 noteholder.innerHTML +=
684 "<div class='footnote' id='_footnote_" + n + "'>" +
685 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
686 n + "</a>. " + note + "</div>";
687 var id =spans[i].getAttribute("id");
688 if (id != null) refs["#"+id] = n;
689 }
690 }
691 if (n == 0)
692 noteholder.parentNode.removeChild(noteholder);
693 else {
694 // Process footnoterefs.
695 for (i=0; i<spans.length; i++) {
696 if (spans[i].className == "footnoteref") {
697 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
698 href = href.match(/#.*/)[0]; // Because IE return full URL.
699 n = refs[href];
700 spans[i].innerHTML =
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n + "</a>]";
703 }
704 }
705 }
706},
707
708install: function(toclevels) {
709 var timerId;
710
711 function reinstall() {
712 asciidoc.footnotes();
713 if (toclevels) {
714 asciidoc.toc(toclevels);
715 }
716 }
717
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
720 reinstall();
721 }
722
723 timerId = setInterval(reinstall, 500);
724 if (document.addEventListener)
725 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
726 else
727 window.onload = reinstallAndRemoveTimer;
728}
729
730}
Junio C Hamano9d971152012-12-19 00:43:11731asciidoc.install();
Junio C Hamanof2b74942012-11-20 21:06:26732/*]]>*/
733</script>
734</head>
Junio C Hamano9d971152012-12-19 00:43:11735<body class="article">
Junio C Hamanof2b74942012-11-20 21:06:26736<div id="header">
Junio C Hamano076ffcc2013-02-06 05:13:21737<h1>How to setup Git server over http</h1>
Junio C Hamanoaedeeae2023-07-18 15:55:30738<span id="revdate">2023-07-18</span>
Junio C Hamanof2b74942012-11-20 21:06:26739</div>
740<div id="content">
741<div id="preamble">
742<div class="sectionbody">
Junio C Hamanobf398b72013-11-05 00:40:48743<div class="admonitionblock">
744<table><tr>
745<td class="icon">
746<div class="title">Note</div>
747</td>
748<td class="content">This document is from 2006. A lot has happened since then, and this
749document is now relevant mainly if your web host is not CGI capable.
Junio C Hamanoc14e6ad2014-10-31 20:25:53750Almost everyone else should instead look at <a href="../git-http-backend.html">git-http-backend(1)</a>.</td>
Junio C Hamanobf398b72013-11-05 00:40:48751</tr></table>
752</div>
Junio C Hamanof2b74942012-11-20 21:06:26753<div class="paragraph"><p>Since Apache is one of those packages people like to compile
754themselves while others prefer the bureaucrat&#8217;s dream Debian, it is
755impossible to give guidelines which will work for everyone. Just send
756some feedback to the mailing list at <a href="mailto:git@vger.kernel.org">git@vger.kernel.org</a> to get this
757document tailored to your favorite distro.</p></div>
758<div class="paragraph"><p>What&#8217;s needed:</p></div>
759<div class="ulist"><ul>
760<li>
761<p>
762Have an Apache web-server
763</p>
764<div class="literalblock">
765<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53766<pre><code>On Debian:
Junio C Hamanof2b74942012-11-20 21:06:26767 $ apt-get install apache2
768 To get apache2 by default started,
Junio C Hamanoc14e6ad2014-10-31 20:25:53769 edit /etc/default/apache2 and set NO_START=0</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26770</div></div>
771</li>
772<li>
773<p>
774can edit the configuration of it.
775</p>
776<div class="literalblock">
777<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53778<pre><code>This could be found under /etc/httpd, or refer to your Apache documentation.</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26779</div></div>
780<div class="literalblock">
781<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53782<pre><code>On Debian: this means being able to edit files under /etc/apache2</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26783</div></div>
784</li>
785<li>
786<p>
787can restart it.
788</p>
789<div class="literalblock">
790<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53791<pre><code>'apachectl --graceful' might do. If it doesn't, just stop and
Junio C Hamanof2b74942012-11-20 21:06:26792restart apache. Be warning that active connections to your server
Junio C Hamanoc14e6ad2014-10-31 20:25:53793might be aborted by this.</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26794</div></div>
795<div class="literalblock">
796<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53797<pre><code>On Debian:
Junio C Hamanof2b74942012-11-20 21:06:26798 $ /etc/init.d/apache2 restart
799or
800 $ /etc/init.d/apache2 force-reload
801 (which seems to do the same)
802This adds symlinks from the /etc/apache2/mods-enabled to
Junio C Hamanoc14e6ad2014-10-31 20:25:53803/etc/apache2/mods-available.</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26804</div></div>
805</li>
806<li>
807<p>
808have permissions to chown a directory
809</p>
810</li>
811<li>
812<p>
Junio C Hamano076ffcc2013-02-06 05:13:21813have Git installed on the client, and
Junio C Hamanof2b74942012-11-20 21:06:26814</p>
815</li>
816<li>
817<p>
Junio C Hamano076ffcc2013-02-06 05:13:21818either have Git installed on the server or have a webdav client on
Junio C Hamanof2b74942012-11-20 21:06:26819 the client.
820</p>
821</li>
822</ul></div>
823<div class="paragraph"><p>In effect, this means you&#8217;re going to be root, or that you&#8217;re using a
824preconfigured WebDAV server.</p></div>
825</div>
826</div>
Junio C Hamano9d971152012-12-19 00:43:11827<div class="sect1">
Junio C Hamano076ffcc2013-02-06 05:13:21828<h2 id="_step_1_setup_a_bare_git_repository">Step 1: setup a bare Git repository</h2>
Junio C Hamanof2b74942012-11-20 21:06:26829<div class="sectionbody">
Junio C Hamano076ffcc2013-02-06 05:13:21830<div class="paragraph"><p>At the time of writing, git-http-push cannot remotely create a Git
831repository. So we have to do that at the server side with Git. Another
Junio C Hamanof2b74942012-11-20 21:06:26832option is to generate an empty bare repository at the client and copy
833it to the server with a WebDAV client (which is the only option if Git
834is not installed on the server).</p></div>
835<div class="paragraph"><p>Create the directory under the DocumentRoot of the directories served
836by Apache. As an example we take /usr/local/apache2, but try "grep
837DocumentRoot /where/ever/httpd.conf" to find your root:</p></div>
838<div class="literalblock">
839<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53840<pre><code>$ cd /usr/local/apache/htdocs
841$ mkdir my-new-repo.git</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26842</div></div>
843<div class="literalblock">
844<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53845<pre><code>On Debian:</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26846</div></div>
847<div class="literalblock">
848<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53849<pre><code>$ cd /var/www
850$ mkdir my-new-repo.git</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26851</div></div>
852<div class="paragraph"><p>Initialize a bare repository</p></div>
853<div class="literalblock">
854<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53855<pre><code>$ cd my-new-repo.git
856$ git --bare init</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26857</div></div>
Junio C Hamanoc14e6ad2014-10-31 20:25:53858<div class="paragraph"><p>Change the ownership to your web-server&#8217;s credentials. Use <code>"grep ^User
859httpd.conf"</code> and <code>"grep ^Group httpd.conf"</code> to find out:</p></div>
Junio C Hamanof2b74942012-11-20 21:06:26860<div class="literalblock">
861<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53862<pre><code>$ chown -R www.www .</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26863</div></div>
864<div class="literalblock">
865<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53866<pre><code>On Debian:</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26867</div></div>
868<div class="literalblock">
869<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53870<pre><code>$ chown -R www-data.www-data .</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26871</div></div>
872<div class="paragraph"><p>If you do not know which user Apache runs as, you can alternatively do
873a "chmod -R a+w .", inspect the files which are created later on, and
874set the permissions appropriately.</p></div>
875<div class="paragraph"><p>Restart apache2, and check whether <a href="http://server/my-new-repo.git">http://server/my-new-repo.git</a> gives
876a directory listing. If not, check whether apache started up
877successfully.</p></div>
878</div>
Junio C Hamano9d971152012-12-19 00:43:11879</div>
880<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:26881<h2 id="_step_2_enable_dav_on_this_repository">Step 2: enable DAV on this repository</h2>
882<div class="sectionbody">
883<div class="paragraph"><p>First make sure the dav_module is loaded. For this, insert in httpd.conf:</p></div>
884<div class="literalblock">
885<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53886<pre><code>LoadModule dav_module libexec/httpd/libdav.so
887AddModule mod_dav.c</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26888</div></div>
889<div class="paragraph"><p>Also make sure that this line exists which is the file used for
890locking DAV operations:</p></div>
891<div class="literalblock">
892<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53893<pre><code>DAVLockDB "/usr/local/apache2/temp/DAV.lock"</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26894</div></div>
895<div class="literalblock">
896<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53897<pre><code>On Debian these steps can be performed with:</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26898</div></div>
899<div class="literalblock">
900<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53901<pre><code>Enable the dav and dav_fs modules of apache:
Junio C Hamanof2b74942012-11-20 21:06:26902$ a2enmod dav_fs
903(just to be sure. dav_fs might be unneeded, I don't know)
904$ a2enmod dav
905The DAV lock is located in /etc/apache2/mods-available/dav_fs.conf:
Junio C Hamanoc14e6ad2014-10-31 20:25:53906 DAVLockDB /var/lock/apache2/DAVLock</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26907</div></div>
908<div class="paragraph"><p>Of course, it can point somewhere else, but the string is actually just a
909prefix in some Apache configurations, and therefore the <em>directory</em> has to
910be writable by the user Apache runs as.</p></div>
911<div class="paragraph"><p>Then, add something like this to your httpd.conf</p></div>
912<div class="literalblock">
913<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53914<pre><code>&lt;Location /my-new-repo.git&gt;
Junio C Hamanof2b74942012-11-20 21:06:26915 DAV on
916 AuthType Basic
917 AuthName "Git"
918 AuthUserFile /usr/local/apache2/conf/passwd.git
919 Require valid-user
Junio C Hamanoc14e6ad2014-10-31 20:25:53920&lt;/Location&gt;</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26921</div></div>
922<div class="literalblock">
923<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53924<pre><code>On Debian:
925 Create (or add to) /etc/apache2/conf.d/git.conf :</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26926</div></div>
927<div class="literalblock">
928<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53929<pre><code>&lt;Location /my-new-repo.git&gt;
Junio C Hamanof2b74942012-11-20 21:06:26930 DAV on
931 AuthType Basic
932 AuthName "Git"
933 AuthUserFile /etc/apache2/passwd.git
934 Require valid-user
Junio C Hamanoc14e6ad2014-10-31 20:25:53935&lt;/Location&gt;</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26936</div></div>
937<div class="literalblock">
938<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53939<pre><code>Debian automatically reads all files under /etc/apache2/conf.d.</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26940</div></div>
941<div class="paragraph"><p>The password file can be somewhere else, but it has to be readable by
942Apache and preferably not readable by the world.</p></div>
943<div class="paragraph"><p>Create this file by
944 $ htpasswd -c /usr/local/apache2/conf/passwd.git &lt;user&gt;</p></div>
945<div class="literalblock">
946<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53947<pre><code>On Debian:
948 $ htpasswd -c /etc/apache2/passwd.git &lt;user&gt;</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26949</div></div>
950<div class="paragraph"><p>You will be asked a password, and the file is created. Subsequent calls
951to htpasswd should omit the <em>-c</em> option, since you want to append to the
952existing file.</p></div>
953<div class="paragraph"><p>You need to restart Apache.</p></div>
954<div class="paragraph"><p>Now go to <a href="http://&lt;username&gt;@&lt;servername&gt;/my-new-repo.git">http://&lt;username&gt;@&lt;servername&gt;/my-new-repo.git</a> in your
955browser to check whether it asks for a password and accepts the right
956password.</p></div>
957<div class="paragraph"><p>On Debian:</p></div>
958<div class="literalblock">
959<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53960<pre><code>To test the WebDAV part, do:</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26961</div></div>
962<div class="literalblock">
963<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53964<pre><code>$ apt-get install litmus
965$ litmus http://&lt;servername&gt;/my-new-repo.git &lt;username&gt; &lt;password&gt;</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26966</div></div>
967<div class="literalblock">
968<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53969<pre><code>Most tests should pass.</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26970</div></div>
Junio C Hamanoe1aeb5e2014-06-06 19:16:29971<div class="paragraph"><p>A command-line tool to test WebDAV is cadaver. If you prefer GUIs, for
Junio C Hamanof2b74942012-11-20 21:06:26972example, konqueror can open WebDAV URLs as "webdav://&#8230;" or
973"webdavs://&#8230;".</p></div>
974<div class="paragraph"><p>If you&#8217;re into Windows, from XP onwards Internet Explorer supports
975WebDAV. For this, do Internet Explorer &#8594; Open Location &#8594;
976<a href="http://&lt;servername&gt;/my-new-repo.git">http://&lt;servername&gt;/my-new-repo.git</a> [x] Open as webfolder &#8594; login .</p></div>
977</div>
Junio C Hamano9d971152012-12-19 00:43:11978</div>
979<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:26980<h2 id="_step_3_setup_the_client">Step 3: setup the client</h2>
981<div class="sectionbody">
Junio C Hamano076ffcc2013-02-06 05:13:21982<div class="paragraph"><p>Make sure that you have HTTP support, i.e. your Git was built with
Junio C Hamanof2b74942012-11-20 21:06:26983libcurl (version more recent than 7.10). The command <em>git http-push</em> with
984no argument should display a usage message.</p></div>
985<div class="paragraph"><p>Then, add the following to your $HOME/.netrc (you can do without, but will be
986asked to input your password a <em>lot</em> of times):</p></div>
987<div class="literalblock">
988<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53989<pre><code>machine &lt;servername&gt;
Junio C Hamanof2b74942012-11-20 21:06:26990login &lt;username&gt;
Junio C Hamanoc14e6ad2014-10-31 20:25:53991password &lt;password&gt;</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:26992</div></div>
993<div class="paragraph"><p>&#8230;and set permissions:
994 chmod 600 ~/.netrc</p></div>
995<div class="paragraph"><p>If you want to access the web-server by its IP, you have to type that in,
996instead of the server name.</p></div>
997<div class="paragraph"><p>To check whether all is OK, do:</p></div>
998<div class="literalblock">
999<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531000<pre><code>curl --netrc --location -v http://&lt;username&gt;@&lt;servername&gt;/my-new-repo.git/HEAD</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:261001</div></div>
1002<div class="paragraph"><p>&#8230;this should give something like <em>ref: refs/heads/master</em>, which is
1003the content of the file HEAD on the server.</p></div>
1004<div class="paragraph"><p>Now, add the remote in your existing repository which contains the project
1005you want to export:</p></div>
1006<div class="literalblock">
1007<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531008<pre><code>$ git-config remote.upload.url \
1009 http://&lt;username&gt;@&lt;servername&gt;/my-new-repo.git/</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:261010</div></div>
1011<div class="paragraph"><p>It is important to put the last <em>/</em>; Without it, the server will send
1012a redirect which git-http-push does not (yet) understand, and git-http-push
1013will repeat the request infinitely.</p></div>
1014</div>
Junio C Hamano9d971152012-12-19 00:43:111015</div>
1016<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:261017<h2 id="_step_4_make_the_initial_push">Step 4: make the initial push</h2>
1018<div class="sectionbody">
1019<div class="paragraph"><p>From your client repository, do</p></div>
1020<div class="literalblock">
1021<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531022<pre><code>$ git push upload master</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:261023</div></div>
1024<div class="paragraph"><p>This pushes branch <em>master</em> (which is assumed to be the branch you
1025want to export) to repository called <em>upload</em>, which we previously
1026defined with git-config.</p></div>
1027</div>
Junio C Hamano9d971152012-12-19 00:43:111028</div>
1029<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:261030<h2 id="_using_a_proxy">Using a proxy:</h2>
1031<div class="sectionbody">
1032<div class="paragraph"><p>If you have to access the WebDAV server from behind an HTTP(S) proxy,
Junio C Hamanob5513772019-04-22 03:38:391033set the variable <em>all_proxy</em> to <code>http://proxy-host.com:port</code>, or
1034<code>http://login-on-proxy:passwd-on-proxy@proxy-host.com:port</code>. See <em>man
Junio C Hamanof2b74942012-11-20 21:06:261035curl</em> for details.</p></div>
1036</div>
Junio C Hamano9d971152012-12-19 00:43:111037</div>
1038<div class="sect1">
Junio C Hamanof2b74942012-11-20 21:06:261039<h2 id="_troubleshooting">Troubleshooting:</h2>
1040<div class="sectionbody">
1041<div class="paragraph"><p>If git-http-push says</p></div>
1042<div class="literalblock">
1043<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531044<pre><code>Error: no DAV locking support on remote repo http://...</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:261045</div></div>
1046<div class="paragraph"><p>then it means the web-server did not accept your authentication. Make sure
1047that the user name and password matches in httpd.conf, .netrc and the URL
1048you are uploading to.</p></div>
1049<div class="paragraph"><p>If git-http-push shows you an error (22/502) when trying to MOVE a blob,
1050it means that your web-server somehow does not recognize its name in the
1051request; This can happen when you start Apache, but then disable the
1052network interface. A simple restart of Apache helps.</p></div>
1053<div class="paragraph"><p>Errors like (22/502) are of format (curl error code/http error
1054code). So (22/404) means something like <em>not found</em> at the server.</p></div>
1055<div class="paragraph"><p>Reading /usr/local/apache2/logs/error_log is often helpful.</p></div>
1056<div class="literalblock">
1057<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:531058<pre><code>On Debian: Read /var/log/apache2/error.log instead.</code></pre>
Junio C Hamanof2b74942012-11-20 21:06:261059</div></div>
Junio C Hamano076ffcc2013-02-06 05:13:211060<div class="paragraph"><p>If you access HTTPS locations, Git may fail verifying the SSL
Junio C Hamanof2b74942012-11-20 21:06:261061certificate (this is return code 60). Setting http.sslVerify=false can
1062help diagnosing the problem, but removes security checks.</p></div>
1063<div class="paragraph"><p>Debian References: <a href="http://www.debian-administration.org/articles/285">http://www.debian-administration.org/articles/285</a></p></div>
1064<div class="paragraph"><p>Authors
1065 Johannes Schindelin &lt;<a href="mailto:Johannes.Schindelin@gmx.de">Johannes.Schindelin@gmx.de</a>&gt;
1066 Rutger Nijlunsing &lt;<a href="mailto:git@wingding.demon.nl">git@wingding.demon.nl</a>&gt;
1067 Matthieu Moy &lt;<a href="mailto:Matthieu.Moy@imag.fr">Matthieu.Moy@imag.fr</a>&gt;</p></div>
1068</div>
1069</div>
Junio C Hamano9d971152012-12-19 00:43:111070</div>
Junio C Hamanof2b74942012-11-20 21:06:261071<div id="footnotes"><hr /></div>
1072<div id="footer">
1073<div id="footer-text">
Junio C Hamano2ef0ba32018-01-26 23:13:531074Last updated
Junio C Hamanoaedeeae2023-07-18 15:55:301075 2023-07-18 08:53:37 PDT
Junio C Hamanof2b74942012-11-20 21:06:261076</div>
1077</div>
1078</body>
1079</html>