1113

我知道如何为这样的 HTTPS 请求提供用户名和密码:

git clone https://username:password@remote

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

git clone git@remote.git

我试过这样:

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

但他们没有奏效。

4

12 回答 12

1697

基于迈克尔·沙夫的评论:

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

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

它会提示您输入密码。

或者,您可以使用:

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

这种方式在 GitHub 存储库中对我有用。

于 2012-04-07T12:25:00.737 回答
249

user@host:path/to/repo格式告诉 Git 使用 ssh 以hostusername 登录user。来自git help clone

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

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

前面的部分@是用户名,认证方式(密码、公钥等)由ssh决定,而不是Git。Git 无法将密码传递给 ssh,因为 ssh 甚至可能不使用密码,具体取决于远程服务器的配置。

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

如果您不想一直输入 ssh 密码,典型的解决方案是生成一个公钥/私钥对,将公钥放在远程服务器上的~/.ssh/authorized_keys文件中,然后将私钥加载到ssh-agent. 另请参阅通过 SSH 配置 Git 以登录一次GitHub 的 ssh 密钥密码帮助页面gitolite 的 ssh 文档Heroku 的 ssh 密钥文档

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

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

例如,假设您有两个 GitHub 帐户: foobar. 您的 ssh 密钥foois~/.ssh/foo_github_id和您的 ssh 密钥baris ~/.ssh/bar_github_id。您想git@github.com:foo/foo.git使用您的foo帐户和git@github.com:bar/bar.git您的bar帐户访问。您将以下内容添加到您的~/.ssh/config

Host gh-foo
    Hostname github.com
    User git
    IdentityFile ~/.ssh/foo_github_id
Host gh-bar
    Hostname github.com
    User git
    IdentityFile ~/.ssh/bar_github_id

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

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

完全避免使用 ssh

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

  • GitHub:

    https://username:password@github.com/username/repository.git
    
  • 狡猾的:

    https://username:password@gitorious.org/project/repository.git
    
  • Heroku:请参阅这篇支持文章

警告:将您的密码添加到克隆 URL 将导致 Git 将您的明文密码存储在.git/config. 要在使用 HTTP 时安全地存储您的密码,请使用凭证助手。例如:

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

以上将导致 Git 每 15 分钟询问一次您的密码(默认情况下)。详情请参阅git help credentials

于 2012-04-07T16:16:09.053 回答
82

如果他们正在创建问题,请按照此参数替换您的特殊情况:

 !   #   $   &   '   (   )   *   +   ,   /   :   ;   =   ?   @   [   ]

%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D

所以例如-

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

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

于 2019-12-11T10:51:44.923 回答
75

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

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

1. 创建代币

GitHub 在此处提供了有关如何获取令牌的完整指南,但这里是 TL;DR。

  1. 转到设置 > 开发人员设置 > 个人访问令牌这是直接链接
  2. 单击“生成新令牌”并再次输入您的密码。(这是另一个直接链接
  3. 为其设置描述/名称,检查“repo”权限并点击页面底部的“Generate token”按钮。
  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.不留痕迹

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

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

请注意,我不是专业人士,因此从某种意义上说,上述内容可能并不安全,因为任何形式的取证工作都不会留下任何痕迹。

于 2018-05-05T18:56:40.140 回答
34

尽管有很多答案,但当用户名或密码中包含特殊字符时,我自己面临着重复的问题。

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

比如说,用户名的 URL 编码值

'user+1' 是用户%2B1

和密码的 URL 编码值

'Welcome@1234' 是 Welcome%401234

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

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

git clone https://user+1:Welcome@1234@actual-git-url-for-the-repo给你 403 错误

希望这可以帮助。

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

于 2019-04-17T07:12:59.893 回答
19

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

在此处输入图像描述

于 2018-07-02T10:37:36.730 回答
15

2021 年 8 月 13 日后,您必须使用

  • Git 克隆

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

要生成令牌:

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

  • Git 推送

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

[remote "origin"]
    url = https://username:tokenxxxxxxxxxx@github.com/username/repo.git
于 2021-08-31T05:19:54.787 回答
13

在 Windows上,以下步骤应该在 ing 时重新触发 GitHub 登录窗口git clone

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

结果

于 2018-10-16T11:57:03.800 回答
8

如果您正在使用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}

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

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


现在只需在您的自动化系统需要获取 repo 的任何地方使用https://alice@github.com/my_repo.git - 它将使用git-credential-helper 存储的凭据alicegithub.com

于 2020-04-27T18:21:28.600 回答
5

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

GIT_ASKPASS=$(mktemp) && chmod a+rx $GIT_ASKPASS && export GIT_ASKPASS

cat > $GIT_ASKPASS <<'EOF'
#!/bin/sh
exec echo "$PSW"
EOF

git clone https://${USR}@example.com/repo.git

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

于 2021-01-22T16:10:24.673 回答
5
git config --global core.askpass

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

于 2018-09-05T08:32:31.780 回答
1

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

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

简而言之,我能够输入以下 GIT 命令(提供我的用户名),然后提示 Git 的凭据管理器提示我输入密码,然后我可以保存密码。

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

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

于 2019-10-29T23:04:25.137 回答