我在一个带有git --version
2.20.1的Docker容器中工作,基本映像是Debian 10,我希望使用GIT_ASKPASS
或更好的配置属性core.askpass
通过HTTPS克隆一个git存储库。以下是我尝试过的:
GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<< '#!/bin/bash
exec printf "$JENKINS_CREDENTIALS_USR\n$JENKINS_CREDENTIALS_PSW\n"
'
最初我在Jenkins运行它,但我看到我能够在一个简单的码头容器中复制相同的问题。$JENKINS_CREDENTIALS_USR
和$JENKINS_CREDENTIALS_PSW
的定义如下:
JENKINS_CREDENTIALS_USR=myuser
JENKINS_CREDENTIALS_PSW=mypass
export JENKINS_CREDENTIALS_USR
export JENKINS_CREDENTIALS_PSW
我没有任何全局配置属性集。~/.git-credentials
不存在。错误是:
fatal: Authentication failed for 'https://myserver.com/git/project.git/'
它的工作方式是在HTTPS url中指定用户名,如下所示
git clone https://jenkins@myserver.com/git/project.git .
并且只在GIT_ASKPASS
指出的脚本中打印密码,所以我想知道为什么没有url中的用户名它就不能工作。文档清楚地说
如果设置了
GIT_ASKPASS
环境变量,则调用该变量指定的程序。向命令行上的程序提供适当的提示,并从其标准输出中读取用户的输入。
因为当我试图克隆时,我被问到用户名和密码,原来的GIT_ASKPASS
脚本有什么问题?
发布于 2021-07-13 08:00:35
我找到了解决方案这里。所有的学分都给了@AlexeyPelykh,我只是改编了他的剧本。
在尝试git clone
时,我们的shell脚本会对每个提示行调用一次,基本上如下:
$GIT_ASKPASS "Username for ..."
$GIT_ASKPASS "Password for ..."
我的原始脚本中的问题是,它返回用户名和密码都独立于我的要求。这也是为什么在第二种情况下(URL中指定的用户名),它可以工作,实际上我只需要密码,它只返回这个密码。
这就是我如何修改我的原始脚本,使它与GIT_ASKPASS
一起工作。
GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<< '#!/bin/bash
case "$1" in
Username*) exec echo "$JENKINS_CREDENTIALS_USR" ;;
Password*) exec echo "$JENKINS_CREDENTIALS_PSW" ;;
esac
'
如果您想使用配置变量core.askPass
,请用以下两行替换前两行:
git_askPass_script=$(mktemp) && chmod a+rx $git_askPass_script
cat > $git_askPass_script <<< '#!/bin/bash
并将配置变量设置为:
git config --global core.askPass "$git_askPass_script"
甚至更好
git -c core.askPass="$git_askPass_script" clone ...
https://stackoverflow.com/questions/68344358
复制相似问题