JDB*_*ica 7 ssh git github macos
我有两个 GitHub 帐户,一个用于工作,一个用于个人使用。
由于工作中的 IT 要求,我已经使用 SSH 好几年了,但对于我的个人项目,我一直使用基本身份验证,因为它更容易。
GitHub已弃用基本身份验证,因此我现在想为我的个人项目使用 SSH 密钥。
我已经知道如何创建 SSH 密钥并将其与我的 GitHub 帐户关联,但我只能将 SSH 密钥与一个帐户关联。因此,我创建了第二个 SSH 密钥并将其与我的个人帐户关联,但现在当我克隆我的个人存储库时,我的 git 客户端尝试使用我的工作 SSH 密钥而不是我的个人密钥。
如何配置我的个人存储库以使用我的个人 SSH 密钥以及我的工作存储库以使用我的工作密钥?
我使用的是 Mac。
JDB*_*ica 12
您可以将您的个人存储库配置为使用 SSH“别名”(为了简单起见,我将其称为“别名”)。
\n假设\xe2\x80\x99s 假设你有两个存储库,work-repo并且magnum-opus-repo(当你有一天完成它时,这将永远改变人类位块传输位图的方式)。
git remote -v首先,首先在工作存储库的命令行中运行。您\xe2\x80\x99将看到类似以下内容:
origin git@github.com:day-job-co/work-repo.git (fetch)\norigin git@github.com:day-job-co/work-repo.git (push)\nRun Code Online (Sandbox Code Playgroud)\n冒号之前的前缀git@github.com:告诉您的 SSH 客户端登录 GitHub 时要使用的主机名和用户名。(注意:使用 git 时,您必须使用git用户名。您的实际用户名将始终被拒绝访问。)
但是,您可以为该前缀添加别名!打开~/.ssh/config你可能会看到类似下面的内容:
Host github.com\n IdentityFile ~/.ssh/day-job-co\n UseKeychain yes\nRun Code Online (Sandbox Code Playgroud)\n(如果您在该位置还没有配置文件,或者有关格式的更多详细信息,请参阅https://linuxize.com/post/using-the-ssh-config-file/)
\n这告诉 SSH 客户端在连接到主机时使用您的~/.ssh/day-job-coSSH 密钥文件github.com。
如果您想使用不同的密钥文件,那么您可以轻松添加别名,如下所示:
\nHost github-personal\n IdentityFile ~/.ssh/personal\n User git\n HostName github.com\n UseKeychain yes\nRun Code Online (Sandbox Code Playgroud)\n请注意,创建别名时,您\xe2\x80\x99 需要显式指定实际的User(MUST be git) 和HostName(MUST be github.com)。
现在,在您的个人存储库中运行git origin -v,如果您尚未更改它,您可能会看到类似以下内容的内容:
origin https://github.com/bit-blitter/magnum-opus-repo.git\nRun Code Online (Sandbox Code Playgroud)\n您需要更改此 URL 以使用 SSH,但git@github.com:您将使用您创建的别名\xe2\x80\x99ve,而不是默认前缀:github-personal。
在您的 magnum opus 存储库中运行以下命令:
\ngit remote set-url "origin" "github-personal:bit-blitter/magnum-opus-repo"\nRun Code Online (Sandbox Code Playgroud)\n当git使用SSH登录时,它会找到别名github-personal,使用配置好的User和HostName,git@github.com以及你个人项目的SSH身份密钥文件~/.ssh/personal.
最后,最后一个配置项UseKeychain yes是完全可选的。它只是让您无需在每次推送/拉取/获取等时输入 SSH 密码。
这只是配置存储库的一种方法,但它的设置和维护非常简单明了。
\n小智 6
不幸的是,所提出的解决方案都不适合我。
~/work/,在这里我可以进一步区分子文件夹,例如~/work/priv/、~/work/comp1/、~/work/comp2/等。但这不是必须遵循的结构。它也可以是:~/my_private_account/和 ~/my_work_account`,或任何你喜欢的。解决方案是创建一个自定义.gitconfig文件,其中包含特定配置的条件。在这种情况下,不同的帐户。
我的~/.gitconfig文件:
[user]
name = Dusan Milojkovic
email = dusan.milojkovic@my-example-email.com
; START CUSTOM CONFIG BLOCK FOR PRIVATE ACCOUNT
; include for all repositories inside $HOME/work/priv/
[includeIf "gitdir:~/work/priv/"]
; The import is relative to the importer (this file)
; But, it can also be an absolute path
path = .gitconfig-dmilojkovic.inc
; END CUSTOM CONFIG BLOCK FOR PRIVATE ACCOUNT
; START CUSTOM CONFIG BLOCK FOR WORK ACCOUNT
; include for all repositories inside $HOME/work/comp1/
[includeIf "gitdir:~/work/comp1/"]
; The import is relative to the importer (this file)
; But, it can also be an absolute path
path = .gitconfig-comp1.inc
; END CUSTOM CONFIG BLOCK FOR WORK ACCOUNT
Run Code Online (Sandbox Code Playgroud)
有条件纳入的~/.gitconfig-dmilojkovic.inc
[core]
SshCommand = "ssh -i ~/.ssh/ssh_key_for_private_account"
Run Code Online (Sandbox Code Playgroud)
有条件纳入的~/.gitconfig-comp1.inc
[core]
SshCommand = "ssh -i ~/.ssh/ssh_key_for_work_account"
[user]
name = dmilojkovic
email = dmilojkovic@my-other-email.com
Run Code Online (Sandbox Code Playgroud)
诀窍在于SshCommand = 它定义了子文件夹中所有存储库使用的确切 SSH 密钥。将IncludeIf语句保留在文件中的最后一个位置.gitconfig,因为最后读取的变量将是 git 将使用的变量,但如果您不将一个变量嵌套在另一个变量中,则条件包含不会影响另一个变量。
因此,我现在可以.gitconfig-<ACCOUNT_NAME>.inc为不同的帐户以及我需要的任何其他覆盖创建具有不同 SSH 密钥的自定义文件,并创建一个新IncludeIf语句,只有在满足我的条件时才会有条件地包含该语句。
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
10199 次 |
| 最近记录: |