Skip to content

Commit 44b2289

Browse files
pyokagangitster
authored andcommitted
git-credential-store: support XDG_CONFIG_HOME
Add $XDG_CONFIG_HOME/git/credentials to the default credential search path of git-credential-store. This allows git-credential-store to support user-specific configuration files in accordance with the XDG base directory specification[1]. [1] http://standards.freedesktop.org/basedir-spec/basedir-spec-0.7.html ~/.git-credentials has a higher precedence than $XDG_CONFIG_HOME/git/credentials when looking up credentials. This means that if any duplicate matching credentials are found in the xdg file (due to ~/.git-credentials being updated by old versions of git or outdated tools), they will not be used at all. This is to give the user some leeway in switching to old versions of git while keeping the xdg directory. This is consistent with the behavior of git-config. However, the higher precedence of ~/.git-credentials means that as long as ~/.git-credentials exist, all credentials will be written to the ~/.git-credentials file even if the user has an xdg file as having a ~/.git-credentials file indicates that the user wants to preserve backwards-compatibility. This is also consistent with the behavior of git-config. To make this precedence explicit in docs/git-credential-store, add a new section FILES that lists out the credential file paths in their order of precedence, and explain how the ordering affects the lookup, storage and erase operations. Also, update the documentation for --file to briefly explain the operations on multiple files if the --file option is not provided. Since the xdg file will not be used unless it actually exists, to prevent the situation where some credentials are present in the xdg file while some are present in the home file, users are recommended to not create the xdg file if they require compatibility with old versions of git or outdated tools. Note, though, that "erase" can be used to explicitly erase matching credentials from all files. Helped-by: Matthieu Moy <[email protected]> Helped-by: Junio C Hamano <[email protected]> Helped-by: Jeff King <[email protected]> Helped-by: Eric Sunshine <[email protected]> Signed-off-by: Paul Tan <[email protected]> Reviewed-by: Matthieu Moy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent cb2c279 commit 44b2289

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

Documentation/git-credential-store.txt

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,41 @@ OPTIONS
3131

3232
--file=<path>::
3333

34-
Use `<path>` to store credentials. The file will have its
34+
Use `<path>` to lookup and store credentials. The file will have its
3535
filesystem permissions set to prevent other users on the system
3636
from reading it, but will not be encrypted or otherwise
37-
protected. Defaults to `~/.git-credentials`.
37+
protected. If not specified, credentials will be searched for from
38+
`~/.git-credentials` and `$XDG_CONFIG_HOME/git/credentials`, and
39+
credentials will be written to `~/.git-credentials` if it exists, or
40+
`$XDG_CONFIG_HOME/git/credentials` if it exists and the former does
41+
not. See also <<FILES>>.
42+
43+
[[FILES]]
44+
FILES
45+
-----
46+
47+
If not set explicitly with '--file', there are two files where
48+
git-credential-store will search for credentials in order of precedence:
49+
50+
~/.git-credentials::
51+
User-specific credentials file.
52+
53+
$XDG_CONFIG_HOME/git/credentials::
54+
Second user-specific credentials file. If '$XDG_CONFIG_HOME' is not set
55+
or empty, `$HOME/.config/git/credentials` will be used. Any credentials
56+
stored in this file will not be used if `~/.git-credentials` has a
57+
matching credential as well. It is a good idea not to create this file
58+
if you sometimes use older versions of Git that do not support it.
59+
60+
For credential lookups, the files are read in the order given above, with the
61+
first matching credential found taking precedence over credentials found in
62+
files further down the list.
63+
64+
Credential storage will by default write to the first existing file in the
65+
list. If none of these files exist, `~/.git-credentials` will be created and
66+
written to.
67+
68+
When erasing credentials, matching credentials will be erased from all files.
3869

3970
EXAMPLES
4071
--------

credential-store.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,16 @@ int main(int argc, char **argv)
165165
usage_with_options(usage, options);
166166
op = argv[0];
167167

168-
if (!file)
169-
file = expand_user_path("~/.git-credentials");
170-
if (file)
168+
if (file) {
171169
string_list_append(&fns, file);
172-
else
170+
} else {
171+
if ((file = expand_user_path("~/.git-credentials")))
172+
string_list_append_nodup(&fns, file);
173+
home_config_paths(NULL, &file, "credentials");
174+
if (file)
175+
string_list_append_nodup(&fns, file);
176+
}
177+
if (!fns.nr)
173178
die("unable to set up default path; use --file");
174179

175180
if (credential_read(&c, stdin) < 0)

0 commit comments

Comments
 (0)