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


844

我知道如何为这样的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
你不能 “ @”之前的“ git”已经是用户名。您从哪里获得存储库URL(git@remote.get)?您从哪里得知必须提供不同的用户名和密码?
肯·托马斯

3
我的回购网址来自heroku“ git@heroku.com:zxy-helloworld.git”。而且我使用emacs shell进行克隆和推送。如果外壳程序要求输入密码,emacs将挂起。这是Windows上emacs的一个已知问题:gnu.org/software/emacs/windows/…–
协调

如果用户名是电子邮件怎么办?您如何输入? myemail @ gmail.com @ example.com 吗?
Kyon Perez

Answers:


1316

基于Michael Scharf的评论:

您可以省略密码,以免将其记录在Bash历史记录文件中:

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

它将提示您输入密码。

或者,您可以使用:

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

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


5
顺便说一句,它不必相同。如果您的同事创建了git repo,并且您以其他帐户身份登录,则他们将不同。
holgac 2013年

48
建议不要将密码放在URL中,因为此文件保存在.git / config上。不安全,最好使用ssh键
zetanova

55
@MrDuk没问题,将其转义(如%40 iirc)。
Benjamin Gruenbaum 2014年

57
您可以省略密码:git clone https://username@github.com/username/repository.git。git会询问您,它将不会保存在.git / config或您的bash历史记录中
Michael_Scharf 2015年

36
您还可以在该行的开头键入“ space”,以便linux不会将命令存储在历史记录中
Nicolas Zozol 2016年

212

user@host:path/to/repo格式告诉Git的使用SSH登录到host使用用户名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登录一次有关ssh密钥密码的GitHub帮助页面gitolite的ssh文档Heroku的ssh密钥文档

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

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

例如,假设您有两个GitHub帐户: foobar。为您的SSH密钥foo就是~/.ssh/foo_github_id对你的SSH密钥bar~/.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详细信息,请参见。


这是git如何与SSH一起使用的最好解释。我的理解是,当您指定git@githost.com:path / to / repo.git时,它有效地告诉git用户是git本身,并且它应该从ssh-agent那里获取您的凭据(公钥)托管“ githost.com”。
Anael

39

在@Bassetassen的答案的评论中,@ plosco 提到您git clone https://<token>@github.com/username/repository.git至少可以用来从GitHub进行克隆。我以为我会扩展方法,以防万一有人像我在尝试自动克隆时那样遇到此问题。

GitHub上有关于如何执行此操作的非常方便的指南,但是如果您出于自动化目的将所有内容都包含在一行中,则它并未涵盖如何做。它警告说,将令牌添加到克隆URL会将其以纯文本格式存储在中 .git/config。显然,这几乎对每个用例都是安全隐患,但是由于我计划在完成后删除存储库并吊销令牌,因此我不在乎。

1.创建一个令牌

GitHub上有关于如何获取令牌的完整指南,但这是TL; DR。

  1. 转到“设置”>“开发人员设置”>“个人访问令牌”这是直接链接
  2. 单击“生成新令牌”,然后再次输入密码。(这是另一个直接链接
  3. 为其设置描述/名称,选中“回购”权限,然后点击页面底部的“生成令牌”按钮。
  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历史记录,以确保令牌不会在那里记录。有很多方法可以执行此操作,请参见此问题此问题。但是,将所有以上命令前面加一个空格以防止它们开始存储可能会更容易。

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


1
https://<token>@github.com不被我的门户网站接受,我不得不使用https://oauth2:<token>@github.com
MushyPeas

25

尽管答案很多,但当用户名或密码中包含特殊字符时,我本人会遇到重复的问题。

URL对git的用户名和密码进行编码,然后将其用作URL本身的一部分(无需考虑安全性时)。

说,用户名的URL编码值

“用户+1”是用户%2B1

和密码的URL编码值

“ Welcome @ 1234”受到欢迎%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/


13

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

在此处输入图片说明


11
在命令行中输入密码永远不是一个好主意。您知道系统可能会将命令行历史记录存储在文件中吗?(例如:Linux有一个名为.bash_history的隐藏文件)
augusto

正确。每当执行此操作或类似的操作(有时很方便)时,我总是从历史记录中删除我使用的命令(history -d)。
Francesco Marchetti-Stasi

4
@ FrancescoMarchetti-Stasi您不需要删除命令,只需在命令开头使用空格,它就永远不会存储在历史记录中。
Ishtiyaq Husain

是的-我学会了它只有几个月前,经过近30年的Unix系统...耻辱我:)
弗朗西斯马尔凯蒂,斯塔西

9

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

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

结果



5
git config --global core.askpass

克隆之前,请先运行此方法,然后再修复!


3
尝试了一个,仍然没有要求。
马丁·基夫

设置全局配置绝不是一个好主意,因为它可能会使其他克隆混乱。
马丁

1

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

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

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

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

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


0

如果您正在使用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以纯文本形式存储密码和值。因此,请确保您的令牌/密码具有非常有限的权限。


现在只需使用HTTPS://alice@github.com/my_repo.git无论您的自动化系统需要获取回购-它将使用的凭据alicegithub.com通过GIT-凭证辅助的商店。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.