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>gitcredentials(
7)
</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=
"manpage">
738 gitcredentials(
7) Manual Page
741 <div class=
"sectionbody">
743 Providing usernames and passwords to Git
749 <h2 id=
"_synopsis">SYNOPSIS
</h2>
750 <div class=
"sectionbody">
751 <div class=
"listingblock">
752 <div class=
"content">
753 <pre><code>git config credential.https://example.com.username myusername
754 git config credential.helper
"$helper $options"</code></pre>
759 <h2 id=
"_description">DESCRIPTION
</h2>
760 <div class=
"sectionbody">
761 <div class=
"paragraph"><p>Git will sometimes need credentials from the user in order to perform
762 operations; for example, it may need to ask for a username and password
763 in order to access a remote repository over HTTP. Some remotes accept
764 a personal access token or OAuth access token as a password. This
765 manual describes the mechanisms Git uses to request these credentials,
766 as well as some features to avoid inputting these credentials repeatedly.
</p></div>
770 <h2 id=
"_requesting_credentials">REQUESTING CREDENTIALS
</h2>
771 <div class=
"sectionbody">
772 <div class=
"paragraph"><p>Without any credential helpers defined, Git will try the following
773 strategies to ask the user for usernames and passwords:
</p></div>
774 <div class=
"olist arabic"><ol class=
"arabic">
777 If the
<code>GIT_ASKPASS
</code> environment variable is set, the program
778 specified by the variable is invoked. A suitable prompt is provided
779 to the program on the command line, and the user
’s input is read
780 from its standard output.
785 Otherwise, if the
<code>core.askPass
</code> configuration variable is set, its
786 value is used as above.
791 Otherwise, if the
<code>SSH_ASKPASS
</code> environment variable is set, its
792 value is used as above.
797 Otherwise, the user is prompted on the terminal.
804 <h2 id=
"_avoiding_repetition">AVOIDING REPETITION
</h2>
805 <div class=
"sectionbody">
806 <div class=
"paragraph"><p>It can be cumbersome to input the same credentials over and over. Git
807 provides two methods to reduce this annoyance:
</p></div>
808 <div class=
"olist arabic"><ol class=
"arabic">
811 Static configuration of usernames for a given authentication context.
816 Credential helpers to cache or store passwords, or to interact with
817 a system password wallet or keychain.
821 <div class=
"paragraph"><p>The first is simple and appropriate if you do not have secure storage available
822 for a password. It is generally configured by adding this to your config:
</p></div>
823 <div class=
"listingblock">
824 <div class=
"content">
825 <pre><code>[credential
"https://example.com"]
826 username = me
</code></pre>
828 <div class=
"paragraph"><p>Credential helpers, on the other hand, are external programs from which Git can
829 request both usernames and passwords; they typically interface with secure
830 storage provided by the OS or other programs. Alternatively, a
831 credential-generating helper might generate credentials for certain servers via
833 <div class=
"paragraph"><p>To use a helper, you must first select one to use. Git currently
834 includes the following helpers:
</p></div>
835 <div class=
"dlist"><dl>
841 Cache credentials in memory for a short period of time. See
842 <a href=
"git-credential-cache.html">git-credential-cache(
1)
</a> for details.
850 Store credentials indefinitely on disk. See
851 <a href=
"git-credential-store.html">git-credential-store(
1)
</a> for details.
855 <div class=
"paragraph"><p>You may also have third-party helpers installed; search for
856 <code>credential-*
</code> in the output of
<code>git help -a
</code>, and consult the
857 documentation of individual helpers. Once you have selected a helper,
858 you can tell Git to use it by putting its name into the
859 credential.helper variable.
</p></div>
860 <div class=
"olist arabic"><ol class=
"arabic">
865 <div class=
"listingblock">
866 <div class=
"content">
867 <pre><code>$ git help -a | grep credential-
868 credential-foo
</code></pre>
873 Read its description.
875 <div class=
"listingblock">
876 <div class=
"content">
877 <pre><code>$ git help credential-foo
</code></pre>
884 <div class=
"listingblock">
885 <div class=
"content">
886 <pre><code>$ git config --global credential.helper foo
</code></pre>
891 <h3 id=
"_available_helpers">Available helpers
</h3>
892 <div class=
"paragraph"><p>The community maintains a comprehensive list of Git credential helpers at
893 <a href=
"https://git-scm.com/doc/credential-helpers">https://git-scm.com/doc/credential-helpers
</a>.
</p></div>
896 <h3 id=
"_oauth">OAuth
</h3>
897 <div class=
"paragraph"><p>An alternative to inputting passwords or personal access tokens is to use an
898 OAuth credential helper. Initial authentication opens a browser window to the
899 host. Subsequent authentication happens in the background. Many popular Git
900 hosts support OAuth.
</p></div>
905 <h2 id=
"_credential_contexts">CREDENTIAL CONTEXTS
</h2>
906 <div class=
"sectionbody">
907 <div class=
"paragraph"><p>Git considers each credential to have a context defined by a URL. This context
908 is used to look up context-specific configuration, and is passed to any
909 helpers, which may use it as an index into secure storage.
</p></div>
910 <div class=
"paragraph"><p>For instance, imagine we are accessing
<code>https://example.com/foo.git
</code>. When Git
911 looks into a config file to see if a section matches this context, it will
912 consider the two a match if the context is a more-specific subset of the
913 pattern in the config file. For example, if you have this in your config file:
</p></div>
914 <div class=
"listingblock">
915 <div class=
"content">
916 <pre><code>[credential
"https://example.com"]
917 username = foo
</code></pre>
919 <div class=
"paragraph"><p>then we will match: both protocols are the same, both hosts are the same, and
920 the
"pattern" URL does not care about the path component at all. However, this
921 context would not match:
</p></div>
922 <div class=
"listingblock">
923 <div class=
"content">
924 <pre><code>[credential
"https://kernel.org"]
925 username = foo
</code></pre>
927 <div class=
"paragraph"><p>because the hostnames differ. Nor would it match
<code>foo.example.com
</code>; Git
928 compares hostnames exactly, without considering whether two hosts are part of
929 the same domain. Likewise, a config entry for
<code>http://example.com
</code> would not
930 match: Git compares the protocols exactly. However, you may use wildcards in
931 the domain name and other pattern matching techniques as with the
<code>http.
<URL
>.*
</code>
933 <div class=
"paragraph"><p>If the
"pattern" URL does include a path component, then this too must match
934 exactly: the context
<code>https://example.com/bar/baz.git
</code> will match a config
935 entry for
<code>https://example.com/bar/baz.git
</code> (in addition to matching the config
936 entry for
<code>https://example.com
</code>) but will not match a config entry for
937 <code>https://example.com/bar
</code>.
</p></div>
941 <h2 id=
"_configuration_options">CONFIGURATION OPTIONS
</h2>
942 <div class=
"sectionbody">
943 <div class=
"paragraph"><p>Options for a credential context can be configured either in
944 <code>credential.*
</code> (which applies to all credentials), or
945 <code>credential.
<URL
>.*
</code>, where
<URL
> matches the context as described
947 <div class=
"paragraph"><p>The following options are available in either location:
</p></div>
948 <div class=
"dlist"><dl>
954 The name of an external credential helper, and any associated options.
955 If the helper name is not an absolute path, then the string
<code>git
956 credential-
</code> is prepended. The resulting string is executed by the
957 shell (so, for example, setting this to
<code>foo --option=bar
</code> will execute
958 <code>git credential-foo --option=bar
</code> via the shell. See the manual of
959 specific helpers for examples of their use.
961 <div class=
"paragraph"><p>If there are multiple instances of the
<code>credential.helper
</code> configuration
962 variable, each helper will be tried in turn, and may provide a username,
963 password, or nothing. Once Git has acquired both a username and a
964 non-expired password, no more helpers will be tried.
</p></div>
965 <div class=
"paragraph"><p>If
<code>credential.helper
</code> is configured to the empty string, this resets
966 the helper list to empty (so you may override a helper set by a
967 lower-priority config file by configuring the empty-string helper,
968 followed by whatever set of helpers you would like).
</p></div>
975 A default username, if one is not provided in the URL.
983 By default, Git does not consider the
"path" component of an http URL
984 to be worth matching via external helpers. This means that a credential
985 stored for
<code>https://example.com/foo.git
</code> will also be used for
986 <code>https://example.com/bar.git
</code>. If you do want to distinguish these
987 cases, set this option to
<code>true
</code>.
994 <h2 id=
"_custom_helpers">CUSTOM HELPERS
</h2>
995 <div class=
"sectionbody">
996 <div class=
"paragraph"><p>You can write your own custom helpers to interface with any system in
997 which you keep credentials.
</p></div>
998 <div class=
"paragraph"><p>Credential helpers are programs executed by Git to fetch or save
999 credentials from and to long-term storage (where
"long-term" is simply
1000 longer than a single Git process; e.g., credentials may be stored
1001 in-memory for a few minutes, or indefinitely on disk).
</p></div>
1002 <div class=
"paragraph"><p>Each helper is specified by a single string in the configuration
1003 variable
<code>credential.helper
</code> (and others, see
<a href=
"git-config.html">git-config(
1)
</a>).
1004 The string is transformed by Git into a command to be executed using
1005 these rules:
</p></div>
1006 <div class=
"olist arabic"><ol class=
"arabic">
1009 If the helper string begins with
"!", it is considered a shell
1010 snippet, and everything after the
"!" becomes the command.
1015 Otherwise, if the helper string begins with an absolute path, the
1016 verbatim helper string becomes the command.
1021 Otherwise, the string
"git credential-" is prepended to the helper
1022 string, and the result becomes the command.
1026 <div class=
"paragraph"><p>The resulting command then has an
"operation" argument appended to it
1027 (see below for details), and the result is executed by the shell.
</p></div>
1028 <div class=
"paragraph"><p>Here are some example specifications:
</p></div>
1029 <div class=
"listingblock">
1030 <div class=
"content">
1031 <pre><code># run
"git credential-foo"
1035 # same as above, but pass an argument to the helper
1037 helper =
"foo --bar=baz"
1039 # the arguments are parsed by the shell, so use shell
1040 # quoting if necessary
1042 helper =
"foo --bar='whitespace arg'"
1044 # you can also use an absolute path, which will not use the git wrapper
1046 helper =
"/path/to/my/helper --with-arguments"
1048 # or you can specify your own shell snippet
1049 [credential
"https://example.com"]
1050 username = your_user
1051 helper =
"!f() { test \"$
1\
" = get && echo \"password=$(cat $HOME/.secret)\
"; }; f"</code></pre>
1053 <div class=
"paragraph"><p>Generally speaking, rule (
3) above is the simplest for users to specify.
1054 Authors of credential helpers should make an effort to assist their
1055 users by naming their program
"git-credential-$NAME", and putting it in
1056 the
<code>$PATH
</code> or
<code>$GIT_EXEC_PATH
</code> during installation, which will allow a
1057 user to enable it with
<code>git config credential.helper $NAME
</code>.
</p></div>
1058 <div class=
"paragraph"><p>When a helper is executed, it will have one
"operation" argument
1059 appended to its command line, which is one of:
</p></div>
1060 <div class=
"dlist"><dl>
1061 <dt class=
"hdlist1">
1066 Return a matching credential, if any exists.
1069 <dt class=
"hdlist1">
1074 Store the credential, if applicable to the helper.
1077 <dt class=
"hdlist1">
1082 Remove matching credentials, if any, from the helper
’s storage.
1086 <div class=
"paragraph"><p>The details of the credential will be provided on the helper
’s stdin
1087 stream. The exact format is the same as the input/output format of the
1088 <code>git credential
</code> plumbing command (see the section
<code>INPUT/OUTPUT
1089 FORMAT
</code> in
<a href=
"git-credential.html">git-credential(
1)
</a> for a detailed specification).
</p></div>
1090 <div class=
"paragraph"><p>For a
<code>get
</code> operation, the helper should produce a list of attributes on
1091 stdout in the same format (see
<a href=
"git-credential.html">git-credential(
1)
</a> for common
1092 attributes). A helper is free to produce a subset, or even no values at
1093 all if it has nothing useful to provide. Any provided attributes will
1094 overwrite those already known about by Git
’s credential subsystem.
1095 Unrecognised attributes are silently discarded.
</p></div>
1096 <div class=
"paragraph"><p>While it is possible to override all attributes, well behaving helpers
1097 should refrain from doing so for any attribute other than username and
1099 <div class=
"paragraph"><p>If a helper outputs a
<code>quit
</code> attribute with a value of
<code>true
</code> or
<code>1</code>,
1100 no further helpers will be consulted, nor will the user be prompted
1101 (if no credential has been provided, the operation will then fail).
</p></div>
1102 <div class=
"paragraph"><p>Similarly, no more helpers will be consulted once both username and
1103 password had been provided.
</p></div>
1104 <div class=
"paragraph"><p>For a
<code>store
</code> or
<code>erase
</code> operation, the helper
’s output is ignored.
</p></div>
1105 <div class=
"paragraph"><p>If a helper fails to perform the requested operation or needs to notify
1106 the user of a potential issue, it may write to stderr.
</p></div>
1107 <div class=
"paragraph"><p>If it does not support the requested operation (e.g., a read-only store
1108 or generator), it should silently ignore the request.
</p></div>
1109 <div class=
"paragraph"><p>If a helper receives any other operation, it should silently ignore the
1110 request. This leaves room for future operations to be added (older
1111 helpers will just ignore the new requests).
</p></div>
1115 <h2 id=
"_git">GIT
</h2>
1116 <div class=
"sectionbody">
1117 <div class=
"paragraph"><p>Part of the
<a href=
"git.html">git(
1)
</a> suite
</p></div>
1121 <div id=
"footnotes"><hr /></div>
1123 <div id=
"footer-text">
1125 2023-
07-
18 08:
52:
58 PDT