1 <?xml version=
"1.0" encoding=
"UTF-8"?>
2 <!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">
6 <meta http-equiv=
"Content-Type" content=
"application/xhtml+xml; charset=UTF-8" />
7 <meta name=
"generator" content=
"AsciiDoc 10.2.0" />
8 <title>How to setup Git server over http
</title>
9 <style type=
"text/css">
10 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
14 font-family: Georgia,serif;
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
22 #author, #revnumber, #revdate, #revremark,
24 font-family: Arial,Helvetica,sans-serif;
28 margin:
1em
5%
1em
5%;
33 text-decoration: underline;
49 h1, h2, h3, h4, h5, h6 {
57 border-bottom:
2px solid silver;
77 border:
1px solid silver;
88 ul
> li { color: #aaa; }
89 ul
> li
> * { color: black; }
91 .monospaced, code, pre {
92 font-family:
"Courier New", Courier, monospace;
99 white-space: pre-wrap;
109 #revnumber, #revdate, #revremark {
114 border-top:
2px solid silver;
120 padding-bottom:
0.5em;
124 padding-bottom:
0.5em;
129 margin-bottom:
1.5em;
131 div.imageblock, div.exampleblock, div.verseblock,
132 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133 div.admonitionblock {
135 margin-bottom:
1.5em;
137 div.admonitionblock {
139 margin-bottom:
2.0em;
144 div.content { /* Block element content. */
148 /* Block element titles. */
149 div.title, caption.title {
154 margin-bottom:
0.5em;
160 td div.title:first-child {
163 div.content div.title:first-child {
166 div.content + div.title {
170 div.sidebarblock
> div.content {
172 border:
1px solid #dddddd;
173 border-left:
4px solid #f0f0f0;
177 div.listingblock
> div.content {
178 border:
1px solid #dddddd;
179 border-left:
5px solid #f0f0f0;
184 div.quoteblock, div.verseblock {
188 border-left:
5px solid #f0f0f0;
192 div.quoteblock
> div.attribution {
197 div.verseblock
> pre.content {
198 font-family: inherit;
201 div.verseblock
> div.attribution {
205 /* DEPRECATED: Pre version
8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
210 div.admonitionblock .icon {
214 text-decoration: underline;
216 padding-right:
0.5em;
218 div.admonitionblock td.content {
220 border-left:
3px solid #dddddd;
223 div.exampleblock
> div.content {
224 border-left:
3px solid #dddddd;
228 div.imageblock div.content { padding-left:
0; }
229 span.image img { border-style: none; vertical-align: text-bottom; }
230 a.image:visited { color: white; }
234 margin-bottom:
0.8em;
247 list-style-position: outside;
250 list-style-type: decimal;
253 list-style-type: lower-alpha;
256 list-style-type: upper-alpha;
259 list-style-type: lower-roman;
262 list-style-type: upper-roman;
265 div.compact ul, div.compact ol,
266 div.compact p, div.compact p,
267 div.compact div, div.compact div {
269 margin-bottom:
0.1em;
281 margin-bottom:
0.8em;
284 padding-bottom:
15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
292 padding-right:
0.8em;
298 div.hdlist.compact tr {
307 .footnote, .footnoteref {
311 span.footnote, span.footnoteref {
312 vertical-align: super;
316 margin:
20px
0 20px
0;
320 #footnotes div.footnote {
326 border-top:
1px solid silver;
335 padding-right:
0.5em;
336 padding-bottom:
0.3em;
344 #footer-badges { display: none; }
348 margin-bottom:
2.5em;
356 margin-bottom:
0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
376 span.aqua { color: aqua; }
377 span.black { color: black; }
378 span.blue { color: blue; }
379 span.fuchsia { color: fuchsia; }
380 span.gray { color: gray; }
381 span.green { color: green; }
382 span.lime { color: lime; }
383 span.maroon { color: maroon; }
384 span.navy { color: navy; }
385 span.olive { color: olive; }
386 span.purple { color: purple; }
387 span.red { color: red; }
388 span.silver { color: silver; }
389 span.teal { color: teal; }
390 span.white { color: white; }
391 span.yellow { color: yellow; }
393 span.aqua-background { background: aqua; }
394 span.black-background { background: black; }
395 span.blue-background { background: blue; }
396 span.fuchsia-background { background: fuchsia; }
397 span.gray-background { background: gray; }
398 span.green-background { background: green; }
399 span.lime-background { background: lime; }
400 span.maroon-background { background: maroon; }
401 span.navy-background { background: navy; }
402 span.olive-background { background: olive; }
403 span.purple-background { background: purple; }
404 span.red-background { background: red; }
405 span.silver-background { background: silver; }
406 span.teal-background { background: teal; }
407 span.white-background { background: white; }
408 span.yellow-background { background: yellow; }
410 span.big { font-size:
2em; }
411 span.small { font-size:
0.6em; }
413 span.underline { text-decoration: underline; }
414 span.overline { text-decoration: overline; }
415 span.line-through { text-decoration: line-through; }
417 div.unbreakable { page-break-inside: avoid; }
427 margin-bottom:
1.5em;
429 div.tableblock
> table {
430 border:
3px solid #
527bbd;
432 thead, p.table.header {
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock
> table[
frame=
"void"] {
443 div.tableblock
> table[
frame=
"hsides"] {
444 border-left-style: none;
445 border-right-style: none;
447 div.tableblock
> table[
frame=
"vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
460 margin-bottom:
1.5em;
462 thead, p.tableblock.header {
473 border-color: #
527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
480 border-color: #
527bbd;
483 table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
487 table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
491 table.tableblock.frame-none {
492 border-style: hidden;
495 th.tableblock.halign-left, td.tableblock.halign-left {
498 th.tableblock.halign-center, td.tableblock.halign-center {
501 th.tableblock.halign-right, td.tableblock.halign-right {
505 th.tableblock.valign-top, td.tableblock.valign-top {
508 th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
511 th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
523 padding-bottom:
0.5em;
524 border-top:
2px solid silver;
525 border-bottom:
2px solid silver;
530 body.manpage div.sectionbody {
535 body.manpage div#toc { display: none; }
540 <script type=
"text/javascript">
542 var asciidoc = { // Namespace.
544 /////////////////////////////////////////////////////////////////////
545 // Table Of Contents generator
546 /////////////////////////////////////////////////////////////////////
548 /* Author: Mihai Bazon, September
2002
549 * http://students.infoiasi.ro/~mishoo
551 * Table Of Content generator
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.
558 /* modified by Troy D. Hanson, September
2006. License: GPL */
559 /* modified by Stuart Rackham,
2006,
2009. License: GPL */
562 toc: function (toclevels) {
564 function getText(el) {
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType ==
3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
569 else if (i.firstChild != null)
575 function TocEntry(el, text, toclevel) {
578 this.toclevel = toclevel;
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
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);
602 var toc = document.getElementById(
"toc");
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
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);
617 for (i =
0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
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");
632 div.className =
"toclevel" + entry.toclevel;
633 toc.appendChild(div);
635 if (entries.length ==
0)
636 toc.parentNode.removeChild(toc);
640 /////////////////////////////////////////////////////////////////////
641 // Footnotes generator
642 /////////////////////////////////////////////////////////////////////
644 /* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/
2005/
07/format_footnote.html
648 footnotes: function () {
649 // Delete existing footnote entries in case we're reloading the footnodes.
651 var noteholder = document.getElementById(
"footnotes");
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);
661 for (i =
0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
665 // Rebuild footnote entries.
666 var cont = document.getElementById(
"content");
667 var spans = cont.getElementsByTagName(
"span");
670 for (i=
0; i
<spans.length; i++) {
671 if (spans[i].className ==
"footnote") {
673 var note = spans[i].getAttribute(
"data-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];
679 "[<a id='_footnoteref_" + n +
"' href='#_footnote_" + n +
680 "' title='View footnote' class='footnote'>" + n +
"</a>]";
681 spans[i].setAttribute(
"data-note", note);
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;
692 noteholder.parentNode.removeChild(noteholder);
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.
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n +
"</a>]";
708 install: function(toclevels) {
711 function reinstall() {
712 asciidoc.footnotes();
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
723 timerId = setInterval(reinstall,
500);
724 if (document.addEventListener)
725 document.addEventListener(
"DOMContentLoaded", reinstallAndRemoveTimer, false);
727 window.onload = reinstallAndRemoveTimer;
735 <body class=
"article">
737 <h1>How to setup Git server over http
</h1>
738 <span id=
"revdate">2023-
09-
22</span>
742 <div class=
"sectionbody">
743 <div class=
"admonitionblock">
746 <div class=
"title">Note
</div>
748 <td class=
"content">This document is from
2006. A lot has happened since then, and this
749 document is now relevant mainly if your web host is not CGI capable.
750 Almost everyone else should instead look at
<a href=
"../git-http-backend.html">git-http-backend(
1)
</a>.
</td>
753 <div class=
"paragraph"><p>Since Apache is one of those packages people like to compile
754 themselves while others prefer the bureaucrat
’s dream Debian, it is
755 impossible to give guidelines which will work for everyone. Just send
756 some feedback to the mailing list at
<a href=
"mailto:git@vger.kernel.org">git@vger.kernel.org
</a> to get this
757 document tailored to your favorite distro.
</p></div>
758 <div class=
"paragraph"><p>What
’s needed:
</p></div>
759 <div class=
"ulist"><ul>
762 Have an Apache web-server
764 <div class=
"literalblock">
765 <div class=
"content">
766 <pre><code>On Debian:
767 $ apt-get install apache2
768 To get apache2 by default started,
769 edit /etc/default/apache2 and set NO_START=
0</code></pre>
774 can edit the configuration of it.
776 <div class=
"literalblock">
777 <div class=
"content">
778 <pre><code>This could be found under /etc/httpd, or refer to your Apache documentation.
</code></pre>
780 <div class=
"literalblock">
781 <div class=
"content">
782 <pre><code>On Debian: this means being able to edit files under /etc/apache2
</code></pre>
789 <div class=
"literalblock">
790 <div class=
"content">
791 <pre><code>'apachectl --graceful' might do. If it doesn't, just stop and
792 restart apache. Be warning that active connections to your server
793 might be aborted by this.
</code></pre>
795 <div class=
"literalblock">
796 <div class=
"content">
797 <pre><code>On Debian:
798 $ /etc/init.d/apache2 restart
800 $ /etc/init.d/apache2 force-reload
801 (which seems to do the same)
802 This adds symlinks from the /etc/apache2/mods-enabled to
803 /etc/apache2/mods-available.
</code></pre>
808 have permissions to chown a directory
813 have Git installed on the client, and
818 either have Git installed on the server or have a webdav client on
823 <div class=
"paragraph"><p>In effect, this means you
’re going to be root, or that you
’re using a
824 preconfigured WebDAV server.
</p></div>
828 <h2 id=
"_step_1_setup_a_bare_git_repository">Step
1: setup a bare Git repository
</h2>
829 <div class=
"sectionbody">
830 <div class=
"paragraph"><p>At the time of writing, git-http-push cannot remotely create a Git
831 repository. So we have to do that at the server side with Git. Another
832 option is to generate an empty bare repository at the client and copy
833 it to the server with a WebDAV client (which is the only option if Git
834 is not installed on the server).
</p></div>
835 <div class=
"paragraph"><p>Create the directory under the DocumentRoot of the directories served
836 by Apache. As an example we take /usr/local/apache2, but try
"grep
837 DocumentRoot /where/ever/httpd.conf" to find your root:
</p></div>
838 <div class=
"literalblock">
839 <div class=
"content">
840 <pre><code>$ cd /usr/local/apache/htdocs
841 $ mkdir my-new-repo.git
</code></pre>
843 <div class=
"literalblock">
844 <div class=
"content">
845 <pre><code>On Debian:
</code></pre>
847 <div class=
"literalblock">
848 <div class=
"content">
849 <pre><code>$ cd /var/www
850 $ mkdir my-new-repo.git
</code></pre>
852 <div class=
"paragraph"><p>Initialize a bare repository
</p></div>
853 <div class=
"literalblock">
854 <div class=
"content">
855 <pre><code>$ cd my-new-repo.git
856 $ git --bare init
</code></pre>
858 <div class=
"paragraph"><p>Change the ownership to your web-server
’s credentials. Use
<code>"grep ^User
859 httpd.conf"</code> and
<code>"grep ^Group httpd.conf"</code> to find out:
</p></div>
860 <div class=
"literalblock">
861 <div class=
"content">
862 <pre><code>$ chown -R www.www .
</code></pre>
864 <div class=
"literalblock">
865 <div class=
"content">
866 <pre><code>On Debian:
</code></pre>
868 <div class=
"literalblock">
869 <div class=
"content">
870 <pre><code>$ chown -R www-data.www-data .
</code></pre>
872 <div class=
"paragraph"><p>If you do not know which user Apache runs as, you can alternatively do
873 a
"chmod -R a+w .", inspect the files which are created later on, and
874 set 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
876 a directory listing. If not, check whether apache started up
877 successfully.
</p></div>
881 <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">
886 <pre><code>LoadModule dav_module libexec/httpd/libdav.so
887 AddModule mod_dav.c
</code></pre>
889 <div class=
"paragraph"><p>Also make sure that this line exists which is the file used for
890 locking DAV operations:
</p></div>
891 <div class=
"literalblock">
892 <div class=
"content">
893 <pre><code>DAVLockDB
"/usr/local/apache2/temp/DAV.lock"</code></pre>
895 <div class=
"literalblock">
896 <div class=
"content">
897 <pre><code>On Debian these steps can be performed with:
</code></pre>
899 <div class=
"literalblock">
900 <div class=
"content">
901 <pre><code>Enable the dav and dav_fs modules of apache:
903 (just to be sure. dav_fs might be unneeded, I don't know)
905 The DAV lock is located in /etc/apache2/mods-available/dav_fs.conf:
906 DAVLockDB /var/lock/apache2/DAVLock
</code></pre>
908 <div class=
"paragraph"><p>Of course, it can point somewhere else, but the string is actually just a
909 prefix in some Apache configurations, and therefore the
<em>directory
</em> has to
910 be 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">
914 <pre><code><Location /my-new-repo.git
>
918 AuthUserFile /usr/local/apache2/conf/passwd.git
920 </Location
></code></pre>
922 <div class=
"literalblock">
923 <div class=
"content">
924 <pre><code>On Debian:
925 Create (or add to) /etc/apache2/conf.d/git.conf :
</code></pre>
927 <div class=
"literalblock">
928 <div class=
"content">
929 <pre><code><Location /my-new-repo.git
>
933 AuthUserFile /etc/apache2/passwd.git
935 </Location
></code></pre>
937 <div class=
"literalblock">
938 <div class=
"content">
939 <pre><code>Debian automatically reads all files under /etc/apache2/conf.d.
</code></pre>
941 <div class=
"paragraph"><p>The password file can be somewhere else, but it has to be readable by
942 Apache 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
<user
></p></div>
945 <div class=
"literalblock">
946 <div class=
"content">
947 <pre><code>On Debian:
948 $ htpasswd -c /etc/apache2/passwd.git
<user
></code></pre>
950 <div class=
"paragraph"><p>You will be asked a password, and the file is created. Subsequent calls
951 to htpasswd should omit the
<em>-c
</em> option, since you want to append to the
952 existing 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://<username>@<servername>/my-new-repo.git">http://
<username
>@
<servername
>/my-new-repo.git
</a> in your
955 browser to check whether it asks for a password and accepts the right
957 <div class=
"paragraph"><p>On Debian:
</p></div>
958 <div class=
"literalblock">
959 <div class=
"content">
960 <pre><code>To test the WebDAV part, do:
</code></pre>
962 <div class=
"literalblock">
963 <div class=
"content">
964 <pre><code>$ apt-get install litmus
965 $ litmus http://
<servername
>/my-new-repo.git
<username
> <password
></code></pre>
967 <div class=
"literalblock">
968 <div class=
"content">
969 <pre><code>Most tests should pass.
</code></pre>
971 <div class=
"paragraph"><p>A command-line tool to test WebDAV is cadaver. If you prefer GUIs, for
972 example, konqueror can open WebDAV URLs as
"webdav://…" or
973 "webdavs://…".
</p></div>
974 <div class=
"paragraph"><p>If you
’re into Windows, from XP onwards Internet Explorer supports
975 WebDAV. For this, do Internet Explorer
→ Open Location
→
976 <a href=
"http://<servername>/my-new-repo.git">http://
<servername
>/my-new-repo.git
</a> [x] Open as webfolder
→ login .
</p></div>
980 <h2 id=
"_step_3_setup_the_client">Step
3: setup the client
</h2>
981 <div class=
"sectionbody">
982 <div class=
"paragraph"><p>Make sure that you have HTTP support, i.e. your Git was built with
983 libcurl (version more recent than
7.10). The command
<em>git http-push
</em> with
984 no 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
986 asked to input your password a
<em>lot
</em> of times):
</p></div>
987 <div class=
"literalblock">
988 <div class=
"content">
989 <pre><code>machine
<servername
>
990 login
<username
>
991 password
<password
></code></pre>
993 <div class=
"paragraph"><p>…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,
996 instead 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">
1000 <pre><code>curl --netrc --location -v http://
<username
>@
<servername
>/my-new-repo.git/HEAD
</code></pre>
1002 <div class=
"paragraph"><p>…this should give something like
<em>ref: refs/heads/master
</em>, which is
1003 the 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
1005 you want to export:
</p></div>
1006 <div class=
"literalblock">
1007 <div class=
"content">
1008 <pre><code>$ git-config remote.upload.url \
1009 http://
<username
>@
<servername
>/my-new-repo.git/
</code></pre>
1011 <div class=
"paragraph"><p>It is important to put the last
<em>/
</em>; Without it, the server will send
1012 a redirect which git-http-push does not (yet) understand, and git-http-push
1013 will repeat the request infinitely.
</p></div>
1017 <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">
1022 <pre><code>$ git push upload master
</code></pre>
1024 <div class=
"paragraph"><p>This pushes branch
<em>master
</em> (which is assumed to be the branch you
1025 want to export) to repository called
<em>upload
</em>, which we previously
1026 defined with git-config.
</p></div>
1030 <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,
1033 set 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
1035 curl
</em> for details.
</p></div>
1039 <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">
1044 <pre><code>Error: no DAV locking support on remote repo http://...
</code></pre>
1046 <div class=
"paragraph"><p>then it means the web-server did not accept your authentication. Make sure
1047 that the user name and password matches in httpd.conf, .netrc and the URL
1048 you 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,
1050 it means that your web-server somehow does not recognize its name in the
1051 request; This can happen when you start Apache, but then disable the
1052 network 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
1054 code). 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">
1058 <pre><code>On Debian: Read /var/log/apache2/error.log instead.
</code></pre>
1060 <div class=
"paragraph"><p>If you access HTTPS locations, Git may fail verifying the SSL
1061 certificate (this is return code
60). Setting http.sslVerify=false can
1062 help 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
<<a href=
"mailto:Johannes.Schindelin@gmx.de">Johannes.Schindelin@gmx.de
</a>>
1066 Rutger Nijlunsing
<<a href=
"mailto:git@wingding.demon.nl">git@wingding.demon.nl
</a>>
1067 Matthieu Moy
<<a href=
"mailto:Matthieu.Moy@imag.fr">Matthieu.Moy@imag.fr
</a>></p></div>
1071 <div id=
"footnotes"><hr /></div>
1073 <div id=
"footer-text">
1075 2023-
09-
22 17:
05:
16 PDT