path: root/credential-store.c
diff options
authorPaul Tan <>2015-03-24 05:20:28 (GMT)
committerJunio C Hamano <>2015-03-24 15:08:02 (GMT)
commit44b228985e59966588704eaa7c4ec9832ba0f8ee (patch)
tree15b7634acb5a141d8bb71bb43cff52422c65b386 /credential-store.c
parentcb2c2796e01c6c211b006bd1d15041b7a08d9acb (diff)
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] ~/.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 <> Helped-by: Junio C Hamano <> Helped-by: Jeff King <> Helped-by: Eric Sunshine <> Signed-off-by: Paul Tan <> Reviewed-by: Matthieu Moy <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'credential-store.c')
1 files changed, 9 insertions, 4 deletions
diff --git a/credential-store.c b/credential-store.c
index c519f80..d62dc29 100644
--- a/credential-store.c
+++ b/credential-store.c
@@ -165,11 +165,16 @@ int main(int argc, char **argv)
usage_with_options(usage, options);
op = argv[0];
- if (!file)
- file = expand_user_path("~/.git-credentials");
- if (file)
+ if (file) {
string_list_append(&fns, file);
- else
+ } else {
+ if ((file = expand_user_path("~/.git-credentials")))
+ string_list_append_nodup(&fns, file);
+ home_config_paths(NULL, &file, "credentials");
+ if (file)
+ string_list_append_nodup(&fns, file);
+ }
+ if (!
die("unable to set up default path; use --file");
if (credential_read(&c, stdin) < 0)