blob: 2de7d6f0ea41b1c601601a2920b971c99203eebf [file] [log] [blame]
Junio C Hamano0df92712011-12-21 22:30:441<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6<meta name="generator" content="AsciiDoc 8.5.2" />
7<title>gitcredentials(7)</title>
8<style type="text/css">
9/* Debug borders */
10p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
11/*
12 border: 1px solid red;
13*/
14}
15
16body {
17 margin: 1em 5% 1em 5%;
18}
19
20a {
21 color: blue;
22 text-decoration: underline;
23}
24a:visited {
25 color: fuchsia;
26}
27
28em {
29 font-style: italic;
30 color: navy;
31}
32
33strong {
34 font-weight: bold;
35 color: #083194;
36}
37
38tt {
39 color: navy;
40}
41
42h1, h2, h3, h4, h5, h6 {
43 color: #527bbd;
44 font-family: sans-serif;
45 margin-top: 1.2em;
46 margin-bottom: 0.5em;
47 line-height: 1.3;
48}
49
50h1, h2, h3 {
51 border-bottom: 2px solid silver;
52}
53h2 {
54 padding-top: 0.5em;
55}
56h3 {
57 float: left;
58}
59h3 + * {
60 clear: left;
61}
62
63div.sectionbody {
64 font-family: serif;
65 margin-left: 0;
66}
67
68hr {
69 border: 1px solid silver;
70}
71
72p {
73 margin-top: 0.5em;
74 margin-bottom: 0.5em;
75}
76
77ul, ol, li > p {
78 margin-top: 0;
79}
80
81pre {
82 padding: 0;
83 margin: 0;
84}
85
86span#author {
87 color: #527bbd;
88 font-family: sans-serif;
89 font-weight: bold;
90 font-size: 1.1em;
91}
92span#email {
93}
94span#revnumber, span#revdate, span#revremark {
95 font-family: sans-serif;
96}
97
98div#footer {
99 font-family: sans-serif;
100 font-size: small;
101 border-top: 2px solid silver;
102 padding-top: 0.5em;
103 margin-top: 4.0em;
104}
105div#footer-text {
106 float: left;
107 padding-bottom: 0.5em;
108}
109div#footer-badges {
110 float: right;
111 padding-bottom: 0.5em;
112}
113
114div#preamble {
115 margin-top: 1.5em;
116 margin-bottom: 1.5em;
117}
118div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
119div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
120div.admonitionblock {
121 margin-top: 1.0em;
122 margin-bottom: 1.5em;
123}
124div.admonitionblock {
125 margin-top: 2.0em;
126 margin-bottom: 2.0em;
127 margin-right: 10%;
128 color: #606060;
129}
130
131div.content { /* Block element content. */
132 padding: 0;
133}
134
135/* Block element titles. */
136div.title, caption.title {
137 color: #527bbd;
138 font-family: sans-serif;
139 font-weight: bold;
140 text-align: left;
141 margin-top: 1.0em;
142 margin-bottom: 0.5em;
143}
144div.title + * {
145 margin-top: 0;
146}
147
148td div.title:first-child {
149 margin-top: 0.0em;
150}
151div.content div.title:first-child {
152 margin-top: 0.0em;
153}
154div.content + div.title {
155 margin-top: 0.0em;
156}
157
158div.sidebarblock > div.content {
159 background: #ffffee;
160 border: 1px solid silver;
161 padding: 0.5em;
162}
163
164div.listingblock > div.content {
165 border: 1px solid silver;
166 background: #f4f4f4;
167 padding: 0.5em;
168}
169
170div.quoteblock, div.verseblock {
171 padding-left: 1.0em;
172 margin-left: 1.0em;
173 margin-right: 10%;
174 border-left: 5px solid #dddddd;
175 color: #777777;
176}
177
178div.quoteblock > div.attribution {
179 padding-top: 0.5em;
180 text-align: right;
181}
182
183div.verseblock > div.content {
184 white-space: pre;
185}
186div.verseblock > div.attribution {
187 padding-top: 0.75em;
188 text-align: left;
189}
190/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
191div.verseblock + div.attribution {
192 text-align: left;
193}
194
195div.admonitionblock .icon {
196 vertical-align: top;
197 font-size: 1.1em;
198 font-weight: bold;
199 text-decoration: underline;
200 color: #527bbd;
201 padding-right: 0.5em;
202}
203div.admonitionblock td.content {
204 padding-left: 0.5em;
205 border-left: 3px solid #dddddd;
206}
207
208div.exampleblock > div.content {
209 border-left: 3px solid #dddddd;
210 padding-left: 0.5em;
211}
212
213div.imageblock div.content { padding-left: 0; }
214span.image img { border-style: none; }
215a.image:visited { color: white; }
216
217dl {
218 margin-top: 0.8em;
219 margin-bottom: 0.8em;
220}
221dt {
222 margin-top: 0.5em;
223 margin-bottom: 0;
224 font-style: normal;
225 color: navy;
226}
227dd > *:first-child {
228 margin-top: 0.1em;
229}
230
231ul, ol {
232 list-style-position: outside;
233}
234ol.arabic {
235 list-style-type: decimal;
236}
237ol.loweralpha {
238 list-style-type: lower-alpha;
239}
240ol.upperalpha {
241 list-style-type: upper-alpha;
242}
243ol.lowerroman {
244 list-style-type: lower-roman;
245}
246ol.upperroman {
247 list-style-type: upper-roman;
248}
249
250div.compact ul, div.compact ol,
251div.compact p, div.compact p,
252div.compact div, div.compact div {
253 margin-top: 0.1em;
254 margin-bottom: 0.1em;
255}
256
257div.tableblock > table {
258 border: 3px solid #527bbd;
259}
260thead, p.table.header {
261 font-family: sans-serif;
262 font-weight: bold;
263}
264tfoot {
265 font-weight: bold;
266}
267td > div.verse {
268 white-space: pre;
269}
270p.table {
271 margin-top: 0;
272}
273/* Because the table frame attribute is overriden by CSS in most browsers. */
274div.tableblock > table[frame="void"] {
275 border-style: none;
276}
277div.tableblock > table[frame="hsides"] {
278 border-left-style: none;
279 border-right-style: none;
280}
281div.tableblock > table[frame="vsides"] {
282 border-top-style: none;
283 border-bottom-style: none;
284}
285
286
287div.hdlist {
288 margin-top: 0.8em;
289 margin-bottom: 0.8em;
290}
291div.hdlist tr {
292 padding-bottom: 15px;
293}
294dt.hdlist1.strong, td.hdlist1.strong {
295 font-weight: bold;
296}
297td.hdlist1 {
298 vertical-align: top;
299 font-style: normal;
300 padding-right: 0.8em;
301 color: navy;
302}
303td.hdlist2 {
304 vertical-align: top;
305}
306div.hdlist.compact tr {
307 margin: 0;
308 padding-bottom: 0;
309}
310
311.comment {
312 background: yellow;
313}
314
315.footnote, .footnoteref {
316 font-size: 0.8em;
317}
318
319span.footnote, span.footnoteref {
320 vertical-align: super;
321}
322
323#footnotes {
324 margin: 20px 0 20px 0;
325 padding: 7px 0 0 0;
326}
327
328#footnotes div.footnote {
329 margin: 0 0 5px 0;
330}
331
332#footnotes hr {
333 border: none;
334 border-top: 1px solid silver;
335 height: 1px;
336 text-align: left;
337 margin-left: 0;
338 width: 20%;
339 min-width: 100px;
340}
341
342
343@media print {
344 div#footer-badges { display: none; }
345}
346
347div#toc {
348 margin-bottom: 2.5em;
349}
350
351div#toctitle {
352 color: #527bbd;
353 font-family: sans-serif;
354 font-size: 1.1em;
355 font-weight: bold;
356 margin-top: 1.0em;
357 margin-bottom: 0.1em;
358}
359
360div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
361 margin-top: 0;
362 margin-bottom: 0;
363}
364div.toclevel2 {
365 margin-left: 2em;
366 font-size: 0.9em;
367}
368div.toclevel3 {
369 margin-left: 4em;
370 font-size: 0.9em;
371}
372div.toclevel4 {
373 margin-left: 6em;
374 font-size: 0.9em;
375}
376/* Overrides for manpage documents */
377h1 {
378 padding-top: 0.5em;
379 padding-bottom: 0.5em;
380 border-top: 2px solid silver;
381 border-bottom: 2px solid silver;
382}
383h2 {
384 border-style: none;
385}
386div.sectionbody {
387 margin-left: 5%;
388}
389
390@media print {
391 div#toc { display: none; }
392}
393
394/* Workarounds for IE6's broken and incomplete CSS2. */
395
396div.sidebar-content {
397 background: #ffffee;
398 border: 1px solid silver;
399 padding: 0.5em;
400}
401div.sidebar-title, div.image-title {
402 color: #527bbd;
403 font-family: sans-serif;
404 font-weight: bold;
405 margin-top: 0.0em;
406 margin-bottom: 0.5em;
407}
408
409div.listingblock div.content {
410 border: 1px solid silver;
411 background: #f4f4f4;
412 padding: 0.5em;
413}
414
415div.quoteblock-attribution {
416 padding-top: 0.5em;
417 text-align: right;
418}
419
420div.verseblock-content {
421 white-space: pre;
422}
423div.verseblock-attribution {
424 padding-top: 0.75em;
425 text-align: left;
426}
427
428div.exampleblock-content {
429 border-left: 3px solid #dddddd;
430 padding-left: 0.5em;
431}
432
433/* IE6 sets dynamically generated links as visited. */
434div#toc a:visited { color: blue; }
435</style>
436<script type="text/javascript">
437/*<![CDATA[*/
438window.onload = function(){asciidoc.footnotes();}
439var asciidoc = { // Namespace.
440
441/////////////////////////////////////////////////////////////////////
442// Table Of Contents generator
443/////////////////////////////////////////////////////////////////////
444
445/* Author: Mihai Bazon, September 2002
446 * http://students.infoiasi.ro/~mishoo
447 *
448 * Table Of Content generator
449 * Version: 0.4
450 *
451 * Feel free to use this script under the terms of the GNU General Public
452 * License, as long as you do not remove or alter this notice.
453 */
454
455 /* modified by Troy D. Hanson, September 2006. License: GPL */
456 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
457
458// toclevels = 1..4.
459toc: function (toclevels) {
460
461 function getText(el) {
462 var text = "";
463 for (var i = el.firstChild; i != null; i = i.nextSibling) {
464 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
465 text += i.data;
466 else if (i.firstChild != null)
467 text += getText(i);
468 }
469 return text;
470 }
471
472 function TocEntry(el, text, toclevel) {
473 this.element = el;
474 this.text = text;
475 this.toclevel = toclevel;
476 }
477
478 function tocEntries(el, toclevels) {
479 var result = new Array;
480 var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
481 // Function that scans the DOM tree for header elements (the DOM2
482 // nodeIterator API would be a better technique but not supported by all
483 // browsers).
484 var iterate = function (el) {
485 for (var i = el.firstChild; i != null; i = i.nextSibling) {
486 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
487 var mo = re.exec(i.tagName);
488 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
489 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
490 }
491 iterate(i);
492 }
493 }
494 }
495 iterate(el);
496 return result;
497 }
498
499 var toc = document.getElementById("toc");
500 var entries = tocEntries(document.getElementById("content"), toclevels);
501 for (var i = 0; i < entries.length; ++i) {
502 var entry = entries[i];
503 if (entry.element.id == "")
504 entry.element.id = "_toc_" + i;
505 var a = document.createElement("a");
506 a.href = "#" + entry.element.id;
507 a.appendChild(document.createTextNode(entry.text));
508 var div = document.createElement("div");
509 div.appendChild(a);
510 div.className = "toclevel" + entry.toclevel;
511 toc.appendChild(div);
512 }
513 if (entries.length == 0)
514 toc.parentNode.removeChild(toc);
515},
516
517
518/////////////////////////////////////////////////////////////////////
519// Footnotes generator
520/////////////////////////////////////////////////////////////////////
521
522/* Based on footnote generation code from:
523 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
524 */
525
526footnotes: function () {
527 var cont = document.getElementById("content");
528 var noteholder = document.getElementById("footnotes");
529 var spans = cont.getElementsByTagName("span");
530 var refs = {};
531 var n = 0;
532 for (i=0; i<spans.length; i++) {
533 if (spans[i].className == "footnote") {
534 n++;
535 // Use [\s\S] in place of . so multi-line matches work.
536 // Because JavaScript has no s (dotall) regex flag.
537 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
538 noteholder.innerHTML +=
539 "<div class='footnote' id='_footnote_" + n + "'>" +
540 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
541 n + "</a>. " + note + "</div>";
542 spans[i].innerHTML =
543 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
544 "' title='View footnote' class='footnote'>" + n + "</a>]";
545 var id =spans[i].getAttribute("id");
546 if (id != null) refs["#"+id] = n;
547 }
548 }
549 if (n == 0)
550 noteholder.parentNode.removeChild(noteholder);
551 else {
552 // Process footnoterefs.
553 for (i=0; i<spans.length; i++) {
554 if (spans[i].className == "footnoteref") {
555 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
556 href = href.match(/#.*/)[0]; // Because IE return full URL.
557 n = refs[href];
558 spans[i].innerHTML =
559 "[<a href='#_footnote_" + n +
560 "' title='View footnote' class='footnote'>" + n + "</a>]";
561 }
562 }
563 }
564}
565
566}
567/*]]>*/
568</script>
569</head>
570<body>
571<div id="header">
572<h1>
573gitcredentials(7) Manual Page
574</h1>
575<h2>NAME</h2>
576<div class="sectionbody">
577<p>gitcredentials -
578 providing usernames and passwords to git
579</p>
580</div>
581</div>
582<div id="content">
583<h2 id="_synopsis">SYNOPSIS</h2>
584<div class="sectionbody">
585<div class="listingblock">
586<div class="content">
587<pre><tt>git config credential.https://example.com.username myusername
588git config credential.helper "$helper $options"</tt></pre>
589</div></div>
590</div>
591<h2 id="_description">DESCRIPTION</h2>
592<div class="sectionbody">
593<div class="paragraph"><p>Git will sometimes need credentials from the user in order to perform
594operations; for example, it may need to ask for a username and password
595in order to access a remote repository over HTTP. This manual describes
596the mechanisms git uses to request these credentials, as well as some
597features to avoid inputting these credentials repeatedly.</p></div>
598</div>
599<h2 id="_requesting_credentials">REQUESTING CREDENTIALS</h2>
600<div class="sectionbody">
601<div class="paragraph"><p>Without any credential helpers defined, git will try the following
602strategies to ask the user for usernames and passwords:</p></div>
603<div class="olist arabic"><ol class="arabic">
604<li>
605<p>
606If the <tt>GIT_ASKPASS</tt> environment variable is set, the program
607 specified by the variable is invoked. A suitable prompt is provided
608 to the program on the command line, and the user&#8217;s input is read
609 from its standard output.
610</p>
611</li>
612<li>
613<p>
614Otherwise, if the <tt>core.askpass</tt> configuration variable is set, its
615 value is used as above.
616</p>
617</li>
618<li>
619<p>
620Otherwise, if the <tt>SSH_ASKPASS</tt> environment variable is set, its
621 value is used as above.
622</p>
623</li>
624<li>
625<p>
626Otherwise, the user is prompted on the terminal.
627</p>
628</li>
629</ol></div>
630</div>
631<h2 id="_avoiding_repetition">AVOIDING REPETITION</h2>
632<div class="sectionbody">
633<div class="paragraph"><p>It can be cumbersome to input the same credentials over and over. Git
634provides two methods to reduce this annoyance:</p></div>
635<div class="olist arabic"><ol class="arabic">
636<li>
637<p>
638Static configuration of usernames for a given authentication context.
639</p>
640</li>
641<li>
642<p>
643Credential helpers to cache or store passwords, or to interact with
644 a system password wallet or keychain.
645</p>
646</li>
647</ol></div>
648<div class="paragraph"><p>The first is simple and appropriate if you do not have secure storage available
649for a password. It is generally configured by adding this to your config:</p></div>
650<div class="listingblock">
651<div class="content">
652<pre><tt>[credential "https://example.com"]
653 username = me</tt></pre>
654</div></div>
655<div class="paragraph"><p>Credential helpers, on the other hand, are external programs from which git can
656request both usernames and passwords; they typically interface with secure
657storage provided by the OS or other programs.</p></div>
658<div class="paragraph"><p>To use a helper, you must first select one to use. Git currently
659includes the following helpers:</p></div>
660<div class="dlist"><dl>
661<dt class="hdlist1">
662cache
663</dt>
664<dd>
665<p>
666 Cache credentials in memory for a short period of time. See
Junio C Hamanoa28a9202012-06-21 07:08:23667 <a href="git-credential-cache.html">git-credential-cache(1)</a> for details.
Junio C Hamano0df92712011-12-21 22:30:44668</p>
669</dd>
670<dt class="hdlist1">
671store
672</dt>
673<dd>
674<p>
675 Store credentials indefinitely on disk. See
Junio C Hamanoa28a9202012-06-21 07:08:23676 <a href="git-credential-store.html">git-credential-store(1)</a> for details.
Junio C Hamano0df92712011-12-21 22:30:44677</p>
678</dd>
679</dl></div>
680<div class="paragraph"><p>You may also have third-party helpers installed; search for
681<tt>credential-*</tt> in the output of <tt>git help -a</tt>, and consult the
682documentation of individual helpers. Once you have selected a helper,
683you can tell git to use it by putting its name into the
684credential.helper variable.</p></div>
685<div class="olist arabic"><ol class="arabic">
686<li>
687<p>
688Find a helper.
689</p>
690<div class="listingblock">
691<div class="content">
692<pre><tt>$ git help -a | grep credential-
693credential-foo</tt></pre>
694</div></div>
695</li>
696<li>
697<p>
698Read its description.
699</p>
700<div class="listingblock">
701<div class="content">
702<pre><tt>$ git help credential-foo</tt></pre>
703</div></div>
704</li>
705<li>
706<p>
707Tell git to use it.
708</p>
709<div class="listingblock">
710<div class="content">
711<pre><tt>$ git config --global credential.helper foo</tt></pre>
712</div></div>
713</li>
714</ol></div>
715<div class="paragraph"><p>If there are multiple instances of the <tt>credential.helper</tt> configuration
716variable, each helper will be tried in turn, and may provide a username,
717password, or nothing. Once git has acquired both a username and a
718password, no more helpers will be tried.</p></div>
719</div>
720<h2 id="_credential_contexts">CREDENTIAL CONTEXTS</h2>
721<div class="sectionbody">
722<div class="paragraph"><p>Git considers each credential to have a context defined by a URL. This context
723is used to look up context-specific configuration, and is passed to any
724helpers, which may use it as an index into secure storage.</p></div>
725<div class="paragraph"><p>For instance, imagine we are accessing <tt>https://example.com/foo.git</tt>. When git
726looks into a config file to see if a section matches this context, it will
727consider the two a match if the context is a more-specific subset of the
728pattern in the config file. For example, if you have this in your config file:</p></div>
729<div class="listingblock">
730<div class="content">
731<pre><tt>[credential "https://example.com"]
732 username = foo</tt></pre>
733</div></div>
734<div class="paragraph"><p>then we will match: both protocols are the same, both hosts are the same, and
735the "pattern" URL does not care about the path component at all. However, this
736context would not match:</p></div>
737<div class="listingblock">
738<div class="content">
739<pre><tt>[credential "https://kernel.org"]
740 username = foo</tt></pre>
741</div></div>
742<div class="paragraph"><p>because the hostnames differ. Nor would it match <tt>foo.example.com</tt>; git
743compares hostnames exactly, without considering whether two hosts are part of
744the same domain. Likewise, a config entry for <tt>http://example.com</tt> would not
745match: git compares the protocols exactly.</p></div>
746</div>
747<h2 id="_configuration_options">CONFIGURATION OPTIONS</h2>
748<div class="sectionbody">
749<div class="paragraph"><p>Options for a credential context can be configured either in
750<tt>credential.*</tt> (which applies to all credentials), or
Junio C Hamanob76a6862012-05-02 22:02:46751<tt>credential.&lt;url&gt;.*</tt>, where &lt;url&gt; matches the context as described
Junio C Hamano0df92712011-12-21 22:30:44752above.</p></div>
753<div class="paragraph"><p>The following options are available in either location:</p></div>
754<div class="dlist"><dl>
755<dt class="hdlist1">
756helper
757</dt>
758<dd>
759<p>
760 The name of an external credential helper, and any associated options.
761 If the helper name is not an absolute path, then the string <tt>git
762 credential-</tt> is prepended. The resulting string is executed by the
763 shell (so, for example, setting this to <tt>foo --option=bar</tt> will execute
764 <tt>git credential-foo --option=bar</tt> via the shell. See the manual of
765 specific helpers for examples of their use.
766</p>
767</dd>
768<dt class="hdlist1">
769username
770</dt>
771<dd>
772<p>
773 A default username, if one is not provided in the URL.
774</p>
775</dd>
776<dt class="hdlist1">
777useHttpPath
778</dt>
779<dd>
780<p>
781 By default, git does not consider the "path" component of an http URL
782 to be worth matching via external helpers. This means that a credential
783 stored for <tt>https://example.com/foo.git</tt> will also be used for
784 <tt>https://example.com/bar.git</tt>. If you do want to distinguish these
785 cases, set this option to <tt>true</tt>.
786</p>
787</dd>
788</dl></div>
789</div>
790<h2 id="_custom_helpers">CUSTOM HELPERS</h2>
791<div class="sectionbody">
792<div class="paragraph"><p>You can write your own custom helpers to interface with any system in
793which you keep credentials. See the documentation for git&#8217;s
794<a href="technical/api-credentials.html">credentials API</a> for details.</p></div>
795</div>
796<h2 id="_git">GIT</h2>
797<div class="sectionbody">
Junio C Hamanoa28a9202012-06-21 07:08:23798<div class="paragraph"><p>Part of the <a href="git.html">git(1)</a> suite</p></div>
Junio C Hamano0df92712011-12-21 22:30:44799</div>
800</div>
801<div id="footnotes"><hr /></div>
802<div id="footer">
803<div id="footer-text">
Junio C Hamanob76a6862012-05-02 22:02:46804Last updated 2012-05-02 15:00:44 PDT
Junio C Hamano0df92712011-12-21 22:30:44805</div>
806</div>
807</body>
808</html>