blob: 2a249ef8e26257fb824e979a28bafb2d4ca4e215 [file] [log] [blame]
Junio C Hamano8edb4c72012-07-09 20:33:551<!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>git-credential(1)</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>
573git-credential(1) Manual Page
574</h1>
575<h2>NAME</h2>
576<div class="sectionbody">
577<p>git-credential -
578 retrieve and store user credentials
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 credential &lt;fill|approve|reject&gt;</tt></pre>
588</div></div>
589</div>
590<h2 id="_description">DESCRIPTION</h2>
591<div class="sectionbody">
592<div class="paragraph"><p>Git has an internal interface for storing and retrieving credentials
593from system-specific helpers, as well as prompting the user for
594usernames and passwords. The git-credential command exposes this
595interface to scripts which may want to retrieve, store, or prompt for
596credentials in the same manner as git. The design of this scriptable
597interface models the internal C API; see
598<a href="technical/api-credentials.txt">the git credential API</a> for more
599background on the concepts.</p></div>
600<div class="paragraph"><p>git-credential takes an "action" option on the command-line (one of
601<tt>fill</tt>, <tt>approve</tt>, or <tt>reject</tt>) and reads a credential description
602on stdin (see <a href="#IOFMT">INPUT/OUTPUT FORMAT</a>).</p></div>
603<div class="paragraph"><p>If the action is <tt>fill</tt>, git-credential will attempt to add "username"
604and "password" attributes to the description by reading config files,
605by contacting any configured credential helpers, or by prompting the
606user. The username and password attributes of the credential
607description are then printed to stdout together with the attributes
608already provided.</p></div>
609<div class="paragraph"><p>If the action is <tt>approve</tt>, git-credential will send the description
610to any configured credential helpers, which may store the credential
611for later use.</p></div>
612<div class="paragraph"><p>If the action is <tt>reject</tt>, git-credential will send the description to
613any configured credential helpers, which may erase any stored
614credential matching the description.</p></div>
615<div class="paragraph"><p>If the action is <tt>approve</tt> or <tt>reject</tt>, no output should be emitted.</p></div>
616</div>
617<h2 id="_typical_use_of_git_credential">TYPICAL USE OF GIT CREDENTIAL</h2>
618<div class="sectionbody">
619<div class="paragraph"><p>An application using git-credential will typically use <tt>git
620credential</tt> following these steps:</p></div>
621<div class="olist arabic"><ol class="arabic">
622<li>
623<p>
624Generate a credential description based on the context.
625</p>
626<div class="paragraph"><p>For example, if we want a password for
627<tt>https://example.com/foo.git</tt>, we might generate the following
628credential description (don&#8217;t forget the blank line at the end; it
629tells <tt>git credential</tt> that the application finished feeding all the
630infomation it has):</p></div>
631<div class="literalblock">
632<div class="content">
633<pre><tt>protocol=https
634host=example.com
635path=foo.git</tt></pre>
636</div></div>
637</li>
638<li>
639<p>
640Ask git-credential to give us a username and password for this
641 description. This is done by running <tt>git credential fill</tt>,
642 feeding the description from step (1) to its standard input. The complete
643 credential description (including the credential per se, i.e. the
644 login and password) will be produced on standard output, like:
645</p>
646<div class="literalblock">
647<div class="content">
648<pre><tt>protocol=https
649host=example.com
650username=bob
651password=secr3t</tt></pre>
652</div></div>
653<div class="paragraph"><p>In most cases, this means the attributes given in the input will be
654repeated in the output, but git may also modify the credential
655description, for example by removing the <tt>path</tt> attribute when the
656protocol is HTTP(s) and <tt>credential.useHttpPath</tt> is false.</p></div>
657<div class="paragraph"><p>If the <tt>git credential</tt> knew about the password, this step may
658not have involved the user actually typing this password (the
659user may have typed a password to unlock the keychain instead,
660or no user interaction was done if the keychain was already
661unlocked) before it returned <tt>password=secr3t</tt>.</p></div>
662</li>
663<li>
664<p>
665Use the credential (e.g., access the URL with the username and
666 password from step (2)), and see if it&#8217;s accepted.
667</p>
668</li>
669<li>
670<p>
671Report on the success or failure of the password. If the
672 credential allowed the operation to complete successfully, then
673 it can be marked with an "approve" action to tell <tt>git
674 credential</tt> to reuse it in its next invocation. If the credential
675 was rejected during the operation, use the "reject" action so
676 that <tt>git credential</tt> will ask for a new password in its next
677 invocation. In either case, <tt>git credential</tt> should be fed with
678 the credential description obtained from step (2) (which also
679 contain the ones provided in step (1)).
680</p>
681</li>
682</ol></div>
683</div>
684<h2 id="IOFMT">INPUT/OUTPUT FORMAT</h2>
685<div class="sectionbody">
686<div class="paragraph"><p><tt>git credential</tt> reads and/or writes (depending on the action used)
Junio C Hamano44dcd492012-07-24 04:35:38687credential information in its standard input/output. This information
Junio C Hamano8edb4c72012-07-09 20:33:55688can correspond either to keys for which <tt>git credential</tt> will obtain
689the login/password information (e.g. host, protocol, path), or to the
690actual credential data to be obtained (login/password).</p></div>
Junio C Hamano44dcd492012-07-24 04:35:38691<div class="paragraph"><p>The credential is split into a set of named attributes, with one
692attribute per line. Each attribute is
Junio C Hamano8edb4c72012-07-09 20:33:55693specified by a key-value pair, separated by an <tt>=</tt> (equals) sign,
694followed by a newline. The key may contain any bytes except <tt>=</tt>,
695newline, or NUL. The value may contain any bytes except newline or NUL.
696In both cases, all bytes are treated as-is (i.e., there is no quoting,
697and one cannot transmit a value with newline or NUL in it). The list of
698attributes is terminated by a blank line or end-of-file.
Junio C Hamano44dcd492012-07-24 04:35:38699Git understands the following attributes:</p></div>
Junio C Hamano8edb4c72012-07-09 20:33:55700<div class="dlist"><dl>
701<dt class="hdlist1">
702<tt>protocol</tt>
703</dt>
704<dd>
705<p>
706 The protocol over which the credential will be used (e.g.,
707 <tt>https</tt>).
708</p>
709</dd>
710<dt class="hdlist1">
711<tt>host</tt>
712</dt>
713<dd>
714<p>
715 The remote hostname for a network credential.
716</p>
717</dd>
718<dt class="hdlist1">
719<tt>path</tt>
720</dt>
721<dd>
722<p>
723 The path with which the credential will be used. E.g., for
724 accessing a remote https repository, this will be the
725 repository&#8217;s path on the server.
726</p>
727</dd>
728<dt class="hdlist1">
729<tt>username</tt>
730</dt>
731<dd>
732<p>
733 The credential&#8217;s username, if we already have one (e.g., from a
734 URL, from the user, or from a previously run helper).
735</p>
736</dd>
737<dt class="hdlist1">
738<tt>password</tt>
739</dt>
740<dd>
741<p>
742 The credential&#8217;s password, if we are asking it to be stored.
743</p>
744</dd>
Junio C Hamano44dcd492012-07-24 04:35:38745<dt class="hdlist1">
746<tt>url</tt>
747</dt>
748<dd>
749<p>
750 When this special attribute is read by <tt>git credential</tt>, the
751 value is parsed as a URL and treated as if its constituent parts
752 were read (e.g., <tt>url=https://example.com</tt> would behave as if
753 <tt>protocol=https</tt> and <tt>host=example.com</tt> had been provided). This
754 can help callers avoid parsing URLs themselves. Note that any
755 components which are missing from the URL (e.g., there is no
756 username in the example above) will be set to empty; if you want
757 to provide a URL and override some attributes, provide the URL
758 attribute first, followed by any overrides.
759</p>
760</dd>
Junio C Hamano8edb4c72012-07-09 20:33:55761</dl></div>
762</div>
763</div>
764<div id="footnotes"><hr /></div>
765<div id="footer">
766<div id="footer-text">
Junio C Hamano44dcd492012-07-24 04:35:38767Last updated 2012-07-23 21:34:17 PDT
Junio C Hamano8edb4c72012-07-09 20:33:55768</div>
769</div>
770</body>
771</html>