如何在运行“git clonegit@remote.git”时提供用户名和密码?

我知道如何为HTTPS请求提供用户名和密码,如下所示:

git clone https://username:password@remote

但我想知道如何向远程提供用户名和密码,如下所示:

git clone git@remote.git

我试过这样:

git clone username:password@git@remote.gitgit clone git@username:password@remote.gitgit clone git@remote.git@username:password

但他们没有工作。

2194286 次浏览

根据Michael Scharf的评论:

您可以省略密码,这样它就不会记录在您的Bash历史文件中:

git clone https://username@github.com/username/repository.git

它会提示您输入密码。

或者,您可以使用:

git clone https://username:password@github.com/username/repository.git

这种方式从GitHub存储库为我工作。

user@host:path/to/repo格式告诉Git使用ssh以用户名user登录host。从#3

另一种类似scp的语法也可以与ssh协议一起使用:

[user@]host.xz:path/to/repo.git/

@之前的部分是用户名,身份验证方法(密码、公钥等)由ssh确定,而不是Git。Git无法将密码传递给ssh,因为根据远程服务器的配置,ssh甚至可能不使用密码。

使用ssh-agent避免一直输入密码

如果您不想一直键入ssh密码,典型的解决方案是生成公钥/私钥对,将公钥放在远程服务器上的#0文件中,然后将私钥加载到#1中。另请参阅配置Git overSSH登录一次GitHub关于ssh密钥密码的帮助页面Gitolite的ssh留档Heroku的SSH密钥留档

在GitHub上的多个帐户之间进行选择(或Heroku或…)

如果您在GitHub或Heroku等地方有多个帐户,您将拥有多个ssh密钥(每个帐户至少一个)。要选择要以哪个帐户登录,您必须告诉ssh使用哪个私钥

例如,假设您有两个GitHub帐户:foobarfoo的ssh密钥是~/.ssh/foo_github_idbar的ssh密钥是~/.ssh/bar_github_id。您想使用foo帐户访问git@github.com:foo/foo.git,使用bar帐户访问git@github.com:bar/bar.git。您可以将以下内容添加到bar0中:

Host gh-fooHostname github.comUser gitIdentityFile ~/.ssh/foo_github_idHost gh-barHostname github.comUser gitIdentityFile ~/.ssh/bar_github_id

然后,您将克隆两个存储库,如下所示:

git clone gh-foo:foo/foo.git  # logs in with account foogit clone gh-bar:bar/bar.git  # logs in with account bar

完全避免ssh

一些服务提供HTTP访问作为ssh的替代方案:

  • GitHub:

    https://username:password@github.com/username/repository.git
  • Gitorious:

    https://username:password@gitorious.org/project/repository.git
  • Heroku: See this support article.

WARNING: Adding your password to the clone URL will cause Git to store your plaintext password in .git/config. To securely store your password when using HTTP, use a credential helper. For example:

git config --global credential.helper cachegit config --global credential.https://github.com.username foogit clone https://github.com/foo/repository.git

以上操作将导致Git每15分钟询问一次您的密码(默认情况下)。有关详细信息,请参阅#0

在@Bassetassen回答的评论中,@plosco提到你至少可以使用git clone https://<token>@github.com/username/repository.git从GitHub克隆。我想我会详细说明如何做到这一点,以防有人像我一样在尝试自动化克隆时遇到这个答案。

GitHub有一个关于如何做到这一点的非常方便指南,但它没有涵盖如果你想出于自动化目的将其全部包含在一行中该怎么办。它警告说将令牌添加到克隆URL将以明文形式存储在.git/config。这显然是几乎每个用例的安全风险,但由于我计划在完成后删除存储库并撤销令牌,我不在乎。

1.创建代币

GitHub有一个关于如何获得令牌的整个指南在这里,但这里太长别读了。

  1. 转到设置>开发者设置>个人访问令牌这是直接链接
  2. 单击“生成新令牌”并再次输入您的密码。(h这是另一个直接联系
  3. 为其设置描述/名称,检查“repo”权限并点击页面底部的“生成令牌”按钮。
  4. 复制您的新令牌在你离开页面之前

2.克隆回购

与@plosco给出的命令git clone https://<token>@github.com/<username>/<repository>.git相同,只需将<token><username><repository>替换为您的信息。

如果您想将其克隆到特定文件夹,只需在末尾插入文件夹地址,就像这样:git clone https://<token>@github.com/<username>/<repository.git> <folder><folder>在哪里,你猜对了,要克隆它的文件夹!您当然可以在这里使用...~等,就像在其他地方一样。

3.不留痕迹

并非所有这些都是必要的,这取决于你所做的事情有多敏感。

  • 如果您有一段时间没有使用它的意图,您可能不想让该令牌挂在那里,所以回到代币页面并点击它旁边的删除按钮。
  • 如果您不再需要存储库,请删除它rm -rf <folder>
  • 如果再次需要存储库,但不需要再次自动化,您可以通过执行git remote remove origin删除远程,或者通过运行git remote set-url origin https://github.com/<username>/<repository.git>删除令牌。
  • 清除您的bash历史记录以确保令牌不会留在那里。有很多方法可以做到这一点,请参阅这个问题这个问题。但是,在所有上述命令前面加上一个空格可能更容易,以防止它们被存储在开始时。

请注意,我不是专业人士,所以上述内容可能不安全,因为任何形式的法医工作都不会留下痕迹。

我通过以下方式解决了这个问题:

在此处输入图片描述

git config --global core.askpass

运行这个之前先克隆一样的方法,应该是固定的!

在windows,以下步骤应在git cloneing时重新触发GitHub登录窗口:

  • 搜索“凭据管理器”的开始菜单
  • 选择“Windows凭据”
  • 删除与Git或GitHub相关的任何凭据

结果

虽然有很多答案,但当用户名或密码中包含特殊字符时,我面临着反复出现的问题。

URL为git编码您的用户名和密码,然后将其用作URL本身的一部分(当没有安全问题时)。

说,用户名的URL编码值

'user+1'是用户%2B1

和URL编码的密码值

'Welcome@1234'是欢迎%401234

然后您的GIT克隆URL看起来像,

git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo完美地工作,而,

git clonehttps://user+1:Welcome@1234@实际git-url-for-the-repo给你403个错误

希望这有帮助。

以防万一,想要在线URL编码:https://www.urlencoder.org/

这是一个很好的Stack Overflow问题,答案非常有启发性,因此我能够解决我最近遇到的一个恼人的问题。

我工作的组织使用#0产品(而不是Github),本质上是他们的GitHub版本,这样存储库就可以完全在本地保护。我遇到了与@坐标类似的问题,因为我签出的新存储库需要密码。我的凭据已在所有#1项目中全局保存,所以我不确定是什么导致凭据丢失。

简而言之,我能够输入以下GIT命令(提供只有我的用户名),然后提示Git的Credential Manager提示我输入密码,然后我能够保存密码。

git clone https://user@code.domain.org/git/[organization]/[team]/[repository.git]

注意:括号中的目录子路径只是指内部引用,并且会因您而异!

如果创建问题,请按照此参数替换为ur特殊情况:

 !   #   $   &   '   (   )   *   +   ,   /   :   ;   =   ?   @   [   ]
%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D

举个例子

实际URL:https://usern@me:p@ssword@git/reponame.git

要使用的解决方案URL:https://usern%40me:p%40ssword@git/reponame.git

如果您使用的是http/https,并且您希望在不需要任何用户输入或任何用户提示的情况下(例如:在CI/CD管道内)使用完全自动化流程,您可以使用以下方法利用git credential.helper

GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"# Or you may choose to not specify GIT_CREDS_PATH at all.# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used
git config --global credential.helper "store --file ${GIT_CREDS_PATH}"echo "https://alice:${ALICE_GITHUB_PASSWORD}@github.com" > ${GIT_CREDS_PATH}

您可以选择从以前的shell命令或管道配置等中设置ALICE_GITHUB_PASSWORD环境变量。

请记住,基于“存储”的git-凭据-助手以纯文本形式存储密码和值。因此,请确保您的令牌/密码具有非常有限的权限。


现在只需在自动化系统需要获取仓库的任何地方使用https://alice@github.com/my_repo.git——它将使用github.comalice的凭据作为git-凭据-帮助器的存储。

我更喜欢使用GIT_ASKPASS环境为git提供HTTPS凭据。
如果登录名和密码在USRPSW变量中导出,以下脚本不会在历史记录和磁盘中留下密码痕迹+它不容易受到密码中特殊字符的攻击:

GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS
cat > $GIT_ASKPASS <<'EOF'#!/bin/shexec echo "$PSW"EOF
git clone https://${USR}@example.com/repo.git

NB:注意heldoc标记'EOF'周围的单引号,这意味着临时脚本包含字面上的$PSW个字符,而不是PSW变量的密码/扩展值

2021年8月13日您必须使用

  • git clone

    https://username:token@github.com/username/repository.git

要生成令牌:

设置>>开发者设置>>个人访问令牌>>生成新令牌

  • GitPush

成功克隆后,下次当您执行git push时,您不必再次提及用户名。您可以通过在记事本中打开.git/config文件来确认这一点,它将显示

[remote "origin"]url = https://username:tokenxxxxxxxxxx@github.com/username/repo.git

要克隆存储库,首先您应该生成一个访问令牌(您不能再使用登录密码),然后使用此生成的令牌克隆存储库。

生成访问令牌:

github:
设置>开发人员设置>个人访问令牌>生成新令牌

位桶:
个人设置>应用密码>创建应用密码

克隆存储库:

github:

$ git clone https://YOUR-USERNAME:GENERATED-TOKEN@github.com/YOUR-USERNAME/YOUR-REPOSITORY

位桶:

git clone https://YOUR-USERNAME@bitbucket.org/YOUR-REPOSITORY

它将提示您生成令牌。

如果您将凭据存储在任何类型的凭据助手中,但未将凭据助手配置为全局活动,您可以像这样克隆:

git clone https://git.example.com/ns/repo.git --config=credential.helper=store

这将在克隆之前在本地设置凭据助手配置(仅适用于新存储库)。