fix: invoke git credential helpers via absolute path

Apple Git osxkeychain exclusive-locks argv[0]. A relative name looks in
cwd and fails with "failed to lock git-credential-osxkeychain".
This commit is contained in:
2026-09-08 11:39:25 +08:00
parent dc302bff1c
commit 2dedb9573c
+26 -9
View File
@@ -21,23 +21,40 @@ warn_store_fallback() {
EOF
}
# helper 在 `git --exec-path`,不一定在 PATH。必须 exec 绝对路径:
# Apple Git 的 osxkeychain 会对 argv[0] 做 O_EXLOCK,相对名会去锁 cwd 下的同名文件。
dotfile_git_credential_exec() {
local name="$1"
shift
local helper=""
local exec_path
exec_path="$(git --exec-path 2>/dev/null || true)"
if [ -n "$exec_path" ] && [ -x "$exec_path/git-credential-$name" ]; then
helper="$exec_path/git-credential-$name"
elif command -v "git-credential-$name" >/dev/null 2>&1; then
helper="$(command -v "git-credential-$name")"
else
return 1
fi
exec "$helper" "$@"
}
case "$(uname -s)" in
Darwin)
if command -v git-credential-osxkeychain >/dev/null 2>&1; then
exec git-credential-osxkeychain "$@"
fi
dotfile_git_credential_exec osxkeychain "$@" || true
warn_store_fallback "未找到 osxkeychain"
exec git-credential-store "$@"
dotfile_git_credential_exec store "$@" || true
;;
Linux)
if command -v git-credential-libsecret >/dev/null 2>&1; then
exec git-credential-libsecret "$@"
fi
dotfile_git_credential_exec libsecret "$@" || true
warn_store_fallback "未找到 git-credential-libsecret"
exec git-credential-store "$@"
dotfile_git_credential_exec store "$@" || true
;;
*)
warn_store_fallback "未知系统 $(uname -s)"
exec git-credential-store "$@"
dotfile_git_credential_exec store "$@" || true
;;
esac
echo "git credential helper 不可用" >&2
exit 1