我可以在环境变量中持有git凭据吗?

Jon*_*ram 17 git environment-variables

我想创建一个非常简单的shell脚本,最终将由另一个应用程序调用,它更新本地git存储库:

#!/bin/bash

cd $1
sudo git pull
Run Code Online (Sandbox Code Playgroud)

执行此操作时,我要求提供凭据(我从私有BitBucket存储库中提取).

我可以(简要地)将凭证存储在环境变量中吗?

#!/bin/bash

export  GIT_USERNAME=<user>
export  GIT_PASSWORD=<pass>

cd $1
sudo git pull
Run Code Online (Sandbox Code Playgroud)

以上不起作用.什么事?我可以通过编程方式修改原始URL,但这似乎有点过分.

Pat*_*rek 34

我知道这是一个非常古老的问题但是如果你真的需要为HTTP基本身份验证传递用户名和密码,你可以像这样设置帮助:

git config credential.helper '!f() { sleep 1; echo "username=${GIT_USER}"; echo "password=${GIT_PASSWORD}"; }; f'
Run Code Online (Sandbox Code Playgroud)

更新:我已添加sleep 1到该功能.在某些环境中,由于竞争条件,可能需要它.我有两台运行Debian Jessie的虚拟机.它们具有相同的体系结构,但CPU和核心数不同.在其中一台机器上,助手没有正常工作sleep.另一方面却没有.经过几个小时的调试后,我跑去strace看看发生了什么.它神奇地开始工作.strace刚刚让git变慢了一点.

  • `'!f()` 中的感叹号在这里有什么用?这似乎是对历史上先前命令的引用。无论如何,使用`bash` 将帮助器字符串中的内容作为普通命令执行会导致此语法错误。我很好奇它为什么有效。 (2认同)
  • N/m——我现在看到这是 git 独有的,但我在 git 文档中找不到它。感叹号告诉 git 将字符串配置选项视为可执行的 shell 代码。例如,对于凭证帮助程序,如果它不将其视为可执行文件,则它会尝试将字符串附加到“凭证”参数,并在字符串中指定的其他选项后跟它。 (2认同)

Hum*_*eer 17

如果您在脚本中只运行一个 git 命令,则可以使用 -c 参数使配置更改高度本地化(向右滚动以查看该pull命令)。

git -c credential.helper='!f() { sleep 1; echo "username=${GIT_USER}"; echo "password=${GIT_PASSWORD}"; }; f' pull
Run Code Online (Sandbox Code Playgroud)

(我会对帕特里克的回答发表评论,但在撰写本文时缺乏声誉点)


Mik*_*rer 5

您可以使用以下命令在git config中设置用户名:

git config credential.https://github.com.username $GIT_USER
Run Code Online (Sandbox Code Playgroud)

然后,您可以将GIT_ASKPASS环境变量设置为将提供密码的脚本:

export GIT_ASKPASS=/path/to/git_env_password.sh
Run Code Online (Sandbox Code Playgroud)

的内容为git_env_password.sh

#!/bin/bash
echo $GIT_PASSWORD
Run Code Online (Sandbox Code Playgroud)

注意:这会将用户名存储在git config中,因此,如果您对此不满意,请使用其他解决方案。

有关更多信息,请参考gitcredentials手册页


Rad*_*472 5

是的,你可以使用git-credential-env将 git Passwort/Username 与 env 传递给你

GIT_USER=foo
GIT_PASS=bar
npm install -g git-credential-env
git config credential.helper "env --username=GIT_USER --password=GIT_PASS"
Run Code Online (Sandbox Code Playgroud)

这个项目中的维基说

You can accomplish the same behavior by using an inline bash function:
GIT_USER=foo
GIT_PASS=bar
git config credential.helper "!f() { echo \"username=${GIT_USER}\\npassword=${GIT_PASS}\"; }; f"
Run Code Online (Sandbox Code Playgroud)