GIT:仅适用于http / https克隆的repos:git push failure以明文显示密码

时间:2018-05-31 22:29:46

标签: git

我们正在使用https克隆一个repo,如下所示:Jenkins build:

git clone https://${repo_username}:${repo_password}@internalgit.com/scm/project/repo.git -b ${branch_name} $tmp

在上面的命令中:$ {repo_username}& $ {repo_password}是作为机密传递的Jenkins变量,因此它们不会以明文形式记录。

但是,这会将用户凭据添加到git远程URL,如果出现任何推送失败,则会在以下错误中以明文形式显示凭据:

[ERROR] To https://user:password@internalgit.com/scm/project/repo.git
[ERROR]  ! [remote rejected] master -> master (pre-receive hook declined)
[ERROR] error: failed to push some refs to 'https://user:password@internalgit.com/scm/project/repo.git'

推送失败可能有许多正当理由,但是,屏幕上的打印凭据是不可接受的。

有没有办法:

  • 屏蔽上述错误消息。
  • 更新远程URL以丢失密码,而在推送期间不再提示密码。

继续工作但在我们的用例中不可接受:

  • 将密码存储在凭据缓存中(使用credential.helper)
  • 使用ssh克隆而不是https。

1 个答案:

答案 0 :(得分:1)

假设输出可见但输入不是: <删除> git clone https://${repo_username}:${repo_password}@internalgit.com/scm/project/repo.git -b ${branch_name} $tmp | sed "s/${repo_password}/<redacted>/g"  应该做你想做的事。

我误解了这个问题;对于这个工作的答案,你必须在每次推送时运行它(即git push 2>&1 | sed "s/${repo_password}/<redacted>/g"。我也错过了git打印到stderr,所以除非你想使用process substition ,重定向输出将很困难。

如果密码包含任何特殊的正则表达式字符,您应该转义密码(否则sed可能会比您的意思更多或更少)。 This answer有一些现成的解决方案可以转义字符串以与sed一起使用。