如何为每个 git 存储库管理一个唯一的密钥?

2024-01-30

我在两种情况下使用git:

  • 我用一些Github存储库。
  • 我目前正在使用 OpenShift,它使用ssh and git用于部署。

首先,我用了ssh-keygen用于生成在 OpenShift 站点更新的密钥。这样的密钥存储在~/.ssh/并创造了id_rsa and id_rsa.pub.

然后我开始从 Github 克隆一个存储库,我曾经这样做过ssh-keygen再次开始推动,效果很好。然后我克隆了另一个存储库并开始遇到问题:

克隆到第二个存储库时遇到问题。每次我尝试推动时都会显示类似以下内容:

ERROR: Permission to diegoaguilar/cursoJava.git denied to diegoaguilar/cursoCannibalCreatures. fatal: The remote end hung up unexpectedly

但正如可以看到的diegoaguilar/cursoCannibalCreatures不正确,因为它是another存储库。

我什至尝试删除这样的存储库目录,然后再次克隆它,同样的情况发生了。

我已经下了~/.ssh:

config:

Host cursoJava
Hostname github.com
User git
IdentityFile ~/.ssh/id_java

Host cursoCannibalCreatures
Hostname github.com
User git
IdentityFile ~/.ssh/id_cannibal

Host openshift
Hostname openshift.com
User git
IdentityFile ~/.ssh/openshift

于是得到:

id_cannibal  id_cannibal.pub  id_java  id_java.pub  known_hosts

就像是id_openshift and id_openshift.pub不存在,但由于它不起作用,所以我现在不太关心。

我创建了这样的文件,它们是.pub by ssh-keygen -f <filename>并为每个人提供了不同的密码短语。我添加了内容.pub作为每个 Github 存储库设置中的部署密钥。

我究竟做错了什么?这应该如何运作?并且,当在另一台机器上工作时,如何正确获取这些密钥,证明是我的并且透明地工作?

EDIT

输出git remote -v:

  • 对于 cursoJava 存储库

origin [email protected] /cdn-cgi/l/email-protection:diegoaguilar/cursoJava.git (fetch) origin [email protected] /cdn-cgi/l/email-protection:diegoaguilar/cursoJava.git (push)

  • 对于 cursoCannibalCreatures

origin [email protected] /cdn-cgi/l/email-protection:diegoaguilar/cursoCannibalCreatures.git (fetch) origin [email protected] /cdn-cgi/l/email-protection:diegoaguilar/cursoCannibalCreatures.git (push)


正如《ssh,github,它不起作用 https://stackoverflow.com/a/9551540/6309”,技巧是不要使用默认的 id_rsa(.pub) 名称作为您的公钥:私钥(因为您只能定义one其中几个),但名称不同。

但这只有在您要访问这些存储库时才会发生作为不同的用户

在你的情况下,你正在访问存储库相同的用户, and 一个 SSH 密钥应该足够了。

See "GitHub 帮助 https://help.github.com/articles/error-permission-to-user-repo-denied-to-user-other-repo":

此错误意味着您推送的密钥已作为部署密钥附加到另一个存储库,并且无权访问您尝试推送到的存储库。

要解决此问题,请从存储库中删除部署密钥,然后将密钥附加到您的用户帐户 https://help.github.com/articles/generating-ssh-keys#step-3-add-your-ssh-key-to-github.


这是为了让两个不同的用户使用 GitHub。

然后你定义一个~/.ssh/config您可以在其中通过完整路径引用每个私钥的文件:

Host github1
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_repo1

Host github2
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_repo2

而不是使用[email protected] /cdn-cgi/l/email-protection:user/repo1,你会使用:

github1:user/repo1

这使用了密钥Host entry 'github1' 来引用用户(git), 主机名 (github.com)以及要使用的确切私钥/公钥~/.ssh/id_repo1(.pub)


因此,如果您有第二个存储库,它使用存储为的第二个密钥~/.ssh/id_repo2(.pub),您需要使用条目 'github2'(您可以根据需要命名)上面定义的,然后更改您的 origin 网址:

git remote set-url origin github2:user/repo2

这样,一个git push将使用正确的密钥(用于repo2)

如果不这样做,您将能够推送一个存储库(使用默认密钥~/.ssh/id_rsa(.pub),默认名称),但您将无法推送到第二个存储库,它需要一组不同的公钥/私钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为每个 git 存储库管理一个唯一的密钥? 的相关文章

  • 如何存储和计算版本控制历史记录?

    考虑这个简单的 python 代码 它演示了一个非常简单的字典版本控制设计 def build current history current for action key value in history assert action in
  • 无法访问 Github 403 错误:权限被拒绝

    我是 Git Github 的新手 所以请原谅我的困惑 问题是 我刚刚对本地存储库进行了更改 并且想推送到 Github 上的原点 特别是 gh pages 之前 我一直在使用另一个 Github 帐户 因此我更改了 user name 和
  • 使用 Homebrew 安装 Git 时出现问题 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Homebrew 升级 Git 时出现问题 https stackoverflow com questions 12362021 problems upgrading git with home
  • 显示其 diff 包含特定字符串的所有提交

    正如标题所说 我想找到每个差异包含特定字符串的提交 目前 我使用 git log p filename 它显示了不太像每个差异的界面 我在其中搜索字符串 然后我回溯以找到实际的提交消息 简单的替代方案可能是将 git log p 通过管道传
  • GIT 或 SVN 或...适用于前端开发人员

    我最近开始将一些项目导入到工作中的 Subversion 存储库中 在接下来的几周内 我希望团队中的每个人都能负责自己的源代码控制管理 我选择 SVN 而不是 GIT 的原因是我想要everyone团队中的人员 包括设计师 前端人员 集成商
  • 本地提交推送到中央服务器

    在工作中 我们使用 perforce 并被鼓励定期对其进行承诺 我对此很满意 然而 我想运行像 Mercurial 这样的东西 这样我就可以在本地提交正在进行的工作并且不一定编译 运行的东西 然后从中定期提交到中央 perforce 服务器
  • 为什么我会看到“TypeError:字符串索引必须是整数”?

    我正在学习 Python 并试图将 GitHub 问题转化为可读的形式 使用以下建议如何将 JSON 转换为 CSV https stackoverflow com questions 1871524 convert from json t
  • 如果不是最新的,则阻止 git Push 发送整个存储库

    相关问题 为什么 Git 每次推送 origin master 时都会发送整个存储库 https stackoverflow com questions 1381403 why does git send whole repository
  • Jenkins 多分支:更改 Groovy 的工作描述

    我在詹金斯的多分支项目工作正常 但我想修改job描述 默认情况下为 完整项目名称 xxxx 以更有意义 我可以使用以下命令轻松更改构建描述currentBuild当我的变量Jenkinfile已执行 但我不知道如何修改父作业描述 我的用例是
  • Git合并策略:空格使默认显示不冲突并带来意想不到的结果

    经过多次试验 我得到了这个简单的测试用例场景 a gt b gt c master gt d gt b gt e branch Where b 是樱桃精选b e is a merge from master b 之后完成c and c对相同
  • 包括来自raw.github.com的js

    我有一个 github com 演示页面 链接到https raw github com master file js https raw github com master file js这样我就不需要总是复制 js文件转移到gh pag
  • 如何分叉一个已经分叉了上游的仓库?

    我想分叉 namecoin namecoin 但我已经分叉了比特币 比特币 后者是前者的上游父级 叉链是 比特币 比特币 gt vinced namecoin gt namecoin namecoin 当我分叉 namecoin namec
  • GIT 中的 Fastlane 应用程序文件?如何检索当前的 apple_id?

    我为我的 XCode 项目设置了 Fastlane 来实现构建自动化 至少 Fastfile 包含构建选项 应该位于 GIT 中 但我也很高兴 Appfile 团队标识符 也位于 GIT 中 主要问题 Appfile 应该包含我的 appl
  • IntelliJ Git 集成 - git --version 空输出

    我目前正在尝试使用 IntelliJ 2016 2 的 Git 集成 但每当我将其指向可执行文件时 我都会遇到以下问题 这在技术上并不会阻止集成工作 但它确实会导致更新索引等问题 我正在运行 Windows 7 完全全新安装 但我在以前的
  • 在单独的终端屏幕上显示 git diff 和 git log 输出

    设置新的开发环境后 我遇到了一个奇怪的 git 行为 我不记得过去见过 我习惯于git diff and git log在终端中创建一个新屏幕并在其中显示其输出 什么less默认情况下 我用它作为我的寻呼机 然后我可以退出并返回到之前的终端
  • 中止 `git stash apply` [重复]

    这个问题在这里已经有答案了 我很遗憾应用了存储 错误的分支 我如何撤消此操作并将我的存储返回到我的存储列表 以便稍后将其应用到正确的分支 如果你还没有承诺 你应该能够git stash再次 可能与git reset HEAD first A
  • Git Add - 致命:添加文件失败

    我的 git cmd exe 窗口如下所示 git add NextFolder error unable to create temporary file No such file or directory error NextFolde
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • 在 Xcode 9 上切换分支

    我无法找到使用 Xcode 9 切换分支的菜单项 工作副本菜单似乎已经消失 有任何想法吗 Xcode 9 Xcode 8 Press 2 to open the new Source Control Navigator 右键单击master
  • 使用 Git 部署时压缩 JS/CSS 文件

    我对 git 有点陌生 另外 这是我第一个自动化部署过程的项目 到目前为止 能够做到这一点真是太幸福了git push dev并上传文件 复制配置文件等 现在 当我推送到我的开发服务器时 我想缩小 JS CSS 文件 我正在考虑在服务器上安

随机推荐