当运行 "git clone git@remote.git" 时,我如何提供用户名和密码?

1295
我知道如何在一个https的Git URL中包含用户名和密码,就像这样:
git clone https://username:password@host

但是我想知道如何向SSH远程提供用户名和密码,就像这样:
git clone git@host.git

我试过这样做:
git clone username:password@git@host.git
git clone git@username:password@host.git
git clone git@host.git@username:password

但是他们没有起作用。

6
你不能这样做。在“@”之前的“git”已经是一个用户名了。你从哪里得到的仓库URL(git@remote.get)?你从哪里得到的提供不同的用户名和密码的想法? - Ken Thomases
3
我的仓库URL来自Heroku:“git@heroku.com:zxy-helloworld.git”。我使用Emacs shell进行克隆和推送。如果shell要求密码,Emacs将挂起。这是Windows上Emacs的已知问题:https://www.gnu.org/software/emacs/windows/Sub_002dprocesses.html#index-subprocesses_002c-hanging-when-reading-input-213 - coordinate
5
如果用户名是一个电子邮件地址,如何输入呢?例如:https://myemail@gmail.com@example.com 。 - Kyon Perez
@Honey 这个问题并不是特定于 GitHub 的。 - Szczepan Hołyszewski
17个回答

1903

根据Michael Scharf的评论:

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

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

它会提示您输入密码。

或者,您可以使用:

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

这种方法来自GitHub存储库,对我很有效。


76
不建议将密码放在URL中,因为该文件保存在.git/config中。这样做不安全,最好使用SSH密钥。 - zetanova
62
没问题,将其转义(例如 %40)。 - Benjamin Gruenbaum
75
您可以省略密码:git clone https://username@github.com/username/repository.git。Git 会询问您,但密码不会保存在 .git/config 或您的 bash 历史记录中。 - Michael_Scharf
56
你可以在命令行开头键入 "space",这样 Linux 就不会将该命令存储在历史记录中。 - Nicolas Zozol
13
我喜欢的另一个选项是使用认证令牌代替用户名来跳过任何提示。 git clone https://<token>@github.com/username/repository.git - plosco
显示剩余28条评论

285
user@host:path/to/repo格式告诉Git使用ssh登录到host,用户名为user。从git help clone中得知:

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

[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。您的foo帐户的ssh密钥为~/.ssh/foo_github_id,而bar帐户的ssh密钥为~/.ssh/bar_github_id。您想使用foo帐户访问git@github.com:foo/foo.git,使用bar帐户访问git@github.com:bar/bar.git。您需要将以下内容添加到~/.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
    
  • Gitorious:

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

WARNING: 将密码添加到克隆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


2
这是关于git如何使用SSH的最佳解释。我的理解是,当您指定git@githost.com:path/to/repo.git时,它有效地告诉git用户本身是git,并且应该从ssh-agent中获取您在“githost.com”主机上的凭据(公钥)。 - Anael
太棒了,我只有一个Github账户,但是因为在其他仓库中有两个不同项目的电子邮件,所以用自定义名称替换git@github.com,然后定位到特定电子邮件的IdentityFile,完美地解决了问题! - boardtc

136

如果您的特殊情况造成问题,请按照以下步骤进行替换:

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

%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

3
不要再浪费时间了,使用这个命令:MYPASS=`echo -n "$ORIGPASS" | jq -sRr @uri` - xpusostomos
我非常爱你 - geekyouth
1
这看起来像是对一个不同问题的回答。 - undefined

89
在@Bassetassen的答案评论中,@plosco提到你可以使用git clone https://<token>@github.com/username/repository.git至少从GitHub克隆。我想我会详细说明一下如何做到这一点,以防有人像我一样在尝试自动化一些克隆时遇到这个答案。
GitHub有一个非常方便的指南,介绍了如何做到这一点,但它没有涵盖如果您想将所有内容包含在一行中以进行自动化目的该怎么办。它警告说将令牌添加到克隆URL中将以明文形式存储在.git/config中。对于几乎每种用例,这显然都是一种安全风险,但由于我计划在完成后删除repo并撤销令牌,所以我不在意。

1. 创建一个令牌

GitHub有一个完整的指南, 介绍了如何获取令牌,但以下是TL;DR。

  1. 前往 设置 > 开发者设置 > 个人访问令牌 (这里是直接链接)
  2. 点击 "生成新令牌" 并再次输入密码。(这里是另一个直接链接)
  3. 为其设置一个描述/名称,勾选 "repo" 权限并在页面底部点击 "生成令牌" 按钮。
  4. 在离开页面之前复制你的新令牌

2. 克隆 Repo

与 @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. 不留痕迹

根据您所做的事情的敏感程度,这些步骤可能并非全部必要。

  • 如果您暂时不打算使用令牌,请返回tokens page并单击旁边的删除按钮,以免让令牌悬而未决。
  • 如果您不再需要该存储库,请删除rm -rf <folder>
  • 如果您需要该存储库,但不需要再次自动化它,可以通过运行git remote remove origin或者通过运行git remote set-url origin https://github.com/<username>/<repository.git>来删除令牌。
  • 清除您的bash历史记录,以确保令牌不会留在那里。有很多方法可以做到这一点,请参见this questionthis question。但是,更简单的方法可能是在上述所有命令之前添加一个空格,以防止它们被存储。

请注意,我不是专业人士,因此以上步骤可能在没有任何取证工作的意义上并不安全。


5
https://<token>@github.com was not accepted with my portal, I had to use https://oauth2:<token>@github.com - MushyPeas
@MushyPeas 这个答案只使用 <token> 对于我使用个人访问令牌运行良好。 - Taylor D. Edmiston
然而,为了防止它们被存储,将所有上述命令都以空格开头可能更容易。但这并不是万无一失的!根据HISTCONTROL的设置,即使以空格开头的命令也可能被存储在历史记录中。请参见此SO答案 - ToJo

44

2021年8月13日后,你必须使用以下方式进行Git Clone:

  • Git Clone

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

生成token的方式如下:

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

  • Git Push

成功克隆后,下次使用git push时无需再提及用户名。您可以通过在记事本中打开.git/config文件来确认此操作。

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

34

虽然有很多答案,但我自己在用户名或密码中存在特殊字符时会遇到重复的问题。

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

例如,用户名的URL编码值为

'user+1' 是 user%2B1

以及密码的URL编码值为

'Welcome@1234' 是 Welcome%401234

那么您的GIT Clone 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/


19
我用以下方法解决了这个问题:

输入图像描述


20
在命令行中输入密码从来都不是一个好主意。你知道吗,你的系统可能会将命令行历史记录保存在一个文件中?(例如:Linux中有一个名为.bash_history的隐藏文件) - Augusto
正确。每当我这样做,或类似这样的事情,有时非常方便,我总是从历史记录中删除我使用的命令(history -d)。 - Francesco Marchetti-Stasi
12
@FrancescoMarchetti-Stasi,您无需删除命令,只需在命令开头加上一个空格即可使其永远不会被记录在历史中。 - Ishtiyaq Husain
1
是的 - 我只在几个月前学会了它,在使用Unix系统近30年后...真丢人 :) - Francesco Marchetti-Stasi
1
除非您在存储您输入的命令的公司服务器上,否则不要在命令行中输入密码。在命令行中输入密码从来都不是一个好主意。 - sastorsl
但是密码仍然会保存在.git/config文件中,因此并不安全。 - Swapnil Gangrade

19

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

生成访问令牌:

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

bitbucket:
个人设置 > 应用程序密码 > 创建应用程序密码

克隆仓库:

github:

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

它将提示您输入生成的令牌。


15

在 Windows 上,执行以下步骤可以重新触发 GitHub 登录窗口:git clone

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

result


12

如果你正在使用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,它将使用在git凭证助手中存储的 alicegithub.com上的凭据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接