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

时间:2012-04-07 12:05:23

标签: git

我知道如何为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

但他们没有工作。

11 个答案:

答案 0 :(得分:990)

使用:

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

这种方式适用于GitHub存储库。

基于Michael Scharf的评论:

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

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

它会提示您输入密码。

答案 1 :(得分:180)

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密码,典型的解决方案是generate a public/private key pair,将公钥放在远程服务器上的~/.ssh/authorized_keys file中,然后加载您的私钥进入ssh-agent。另请参阅Configuring Git over SSH to login onceGitHub's help page on ssh key passphrasesgitolite's ssh documentationHeroku's ssh keys documentation

在GitHub(或Heroku或......)

之间选择多个帐户

如果您在GitHub或Heroku这样的地方有多个帐户,您将拥有多个ssh密钥(每个帐户至少有一个)。要选择您要登录的帐户,您必须tell ssh which private key to use

例如,假设您有两个GitHub帐户:foobar。您foo的ssh密钥为~/.ssh/foo_github_idbar的ssh密钥为~/.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

然后您将按如下方式克隆这两个存储库:

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

完全避免使用ssh

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

  • GitHub的:

    https://username:password@gitorious.org/project/repository.git
    
  • Gitorious:

    .git/config
  • Heroku:见this support article

警告:将密码添加到克隆网址会导致Git将您的明文密码存储在git config --global credential.helper cache git config --global credential.https://github.com.username foo git clone https://github.com/foo/repository.git 中。要在使用HTTP时安全地存储密码,请使用凭证帮助程序。例如:

{{1}}

以上情况会导致Git每15分钟(默认情况下)要求输入一次密码。有关详细信息,请参阅git help credentials

答案 2 :(得分:18)

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

GitHub有关于如何执行此操作的very handy指南,但如果您希望将其全部包含在一行中以用于自动化目的,则不会介绍该怎么做。它警告将标记添加到克隆URL会将其以明文形式存储在 .git/config中。这显然是几乎每个用例的安全风险,但由于我计划在完成后删除存储库并撤销令牌,我不在乎。

1。创建令牌

GitHub有关于如何获取令牌的whole guide here,但这里是TL; DR。

  1. 转到设置&gt;开发者设置&gt;个人访问令牌here's a direct link
  2. 点击“生成新令牌”并再次输入密码。 (H ere's another direct link
  3. 为其设置描述/名称,检查“repo”权限并点击页面底部的“Generate token”按钮。
  4. 在离开页面之前复制新令牌
  5. 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。不留痕迹

    并非所有这些都可能是必要的,这取决于你正在做的事情的敏感程度。

    • 如果你有一段时间无意使用它,你可能不想留下那个令牌,所以回到tokens page并点击它旁边的删除按钮。
    • 如果您不再需要回购,请将其删除rm -rf <folder>
    • 如果确实需要再次使用,但不需要再次自动执行,您可以通过执行git remote remove origin删除遥控器,或者只需通过运行git remote set-url origin https://github.com/<username>/<repository.git>删除令牌。
    • 清除bash历史记录以确保令牌不会保留在那里。有很多方法可以执行此操作,请参阅this questionthis question。但是,可能更容易将所有上述命令添加到空格中,以防止它们存储起来。

    请注意,我不是专业人士,因此上述情况可能并不安全,因为任何法医工作都不会留下痕迹。

答案 3 :(得分:7)

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

enter image description here

答案 4 :(得分:4)

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

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

result

答案 5 :(得分:3)

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


现在,只要您的自动化系统需要提取存储库,就只需使用https://alice@github.com/my_repo.git-它会使用git-credential-helper存储的alicegithub.com的凭据。

答案 6 :(得分:3)

我更喜欢使用 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变量的密码/扩展值

答案 7 :(得分:1)

git config --global core.askpass

在以相同方式克隆之前先运行此命令,应该修复!

答案 8 :(得分:1)

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

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

说,用户名的URL编码值

  

“用户+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错误

希望这会有所帮助。

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

答案 9 :(得分:0)

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

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

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

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

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

答案 10 :(得分:0)

如果出现问题,请遵循以下参数将其替换为您的特殊情况:

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

%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

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