我知道如何为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
但他们没有工作。
答案 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 once,GitHub's help page on ssh key passphrases,gitolite's ssh documentation和Heroku's ssh keys documentation。
如果您在GitHub或Heroku这样的地方有多个帐户,您将拥有多个ssh密钥(每个帐户至少有一个)。要选择您要登录的帐户,您必须tell ssh which private key to use。
例如,假设您有两个GitHub帐户:foo
和bar
。您foo
的ssh密钥为~/.ssh/foo_github_id
,bar
的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
某些服务提供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
中。这显然是几乎每个用例的安全风险,但由于我计划在完成后删除存储库并撤销令牌,我不在乎。
GitHub有关于如何获取令牌的whole guide here,但这里是TL; DR。
与@plosco给出的命令git clone https://<token>@github.com/<username>/<repository>.git
相同,只需用您的信息替换<token>
,<username>
和<repository>
。
如果要将其克隆到特定文件夹,只需在最后插入文件夹地址,如下所示:git clone https://<token>@github.com/<username>/<repository.git> <folder>
,其中<folder>
,您猜对了,要将其克隆到的文件夹!您当然可以像在其他地方一样使用.
,..
,~
等。
并非所有这些都可能是必要的,这取决于你正在做的事情的敏感程度。
rm -rf <folder>
。git remote remove origin
删除遥控器,或者只需通过运行git remote set-url origin https://github.com/<username>/<repository.git>
删除令牌。请注意,我不是专业人士,因此上述情况可能并不安全,因为任何法医工作都不会留下痕迹。
答案 3 :(得分:7)
答案 4 :(得分:4)
答案 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存储的alice
中github.com
的凭据。
答案 6 :(得分:3)
我更喜欢使用 GIT_ASKPASS 环境为 git 提供 HTTPS 凭据。
如果在 USR
和 PSW
变量中导出登录名和密码,以下脚本不会在历史记录和磁盘中留下密码痕迹 + 不易受到密码中特殊字符的影响:
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
例如-