多个 Git SSH 密钥在同一 Windows 用户下的正确配置

本文详细记录了在GitHub上使用Fork与PullRequest功能时遇到的权限问题及解决方案。通过配置不同的SSH密钥,成功解决了远程同步失败的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

这个问题是在计划实测 GitHub 的 ForkPull Request 功能时出现的。实战练习至少需要两个 GitHub 帐号——
帐号 A:远程文档库 P 的创建者。
帐号 B:仓库 P 的参与者、合作方。

帐号 B 的操作流程如下:

  1. 从 A 在线叉取P到自己帐号下,记为P1;
  2. 下拉 P1 到本地,并产生新版本 P2;
  3. 同步 P2 到 B 的远程仓库;
  4. 向发起一个归并意向(pull request);

实验进行到第三步时出错,GitBash实测脚本如下(用户信息那行已省略):

$ git clone git@github.com:andong2007/Excel.git Demo
Cloning into 'Demo'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 14 (delta 3), reused 5 (delta 1), pack-reused 0
Receiving objects: 100% (14/14), done.
Resolving deltas: 100% (3/3), done.

$ cd Demo/; echo 'Rem demo comments' >> batchFormatTabels.txt

$ git status -s
 M batchFormatTabels.txt

$ git add -u; git status -s;
warning: LF will be replaced by CRLF in batchFormatTabels.txt.
The file will have its original line endings in your working directory
M  batchFormatTabels.txt

$ git commit -m 'modify a file'
[master 5656244] modify a file
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git push -u origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:andong2007/Excel.git
 ! [remote rejected] master -> master (permission denied)
error: failed to push some refs to 'git@github.com:andong2007/Excel.git'

$

根据最后两句的理解,因为权限问题导致远程同步失败。
当时本机的密钥配置如下:

对比项 \ 密钥密钥A(帐号 A 专用)密钥B(帐号 B 专用)
存放路径私钥:~\.ssh\id_rsa
公钥:~\.ssh\id_rsa.pub
私钥:~\.ssh\id_andong
公钥:~\.ssh\id_andong.pub
创建顺序先创建后创建
下拉时的
调用情况
被调用未被调用

由此可见,问题出在密钥 B 的前后不一致,因为本地按默认的密钥进行了 SSH 校验。具体调用哪个密钥需要手动配置。

解决方法

~\.ssh\下创建配置文件 config,内容如下:

#Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

Host github-zad
HostName github.com
User git
IdentityFile ~/.ssh/id_andong

要领:为不同的密钥配置不同的 HostIdentityFile 即可

用法

  1. 启用默认的 密钥A 克隆远程文档库:
$ git clone git@github.com:andong2007/Excel.git
  1. 启用新增的 密钥B 克隆远程文档库:
$ git clone git@github-zad:andong2007/Excel.git

或者直接:

$ git clone github-zad:andong2007/Excel.git

再次实测

andon@Sinosoft-Zhouad MINGW64 ~/Desktop/excelTest
$ git clone github-zad:andong2007/Excel.git Demo
Cloning into 'Demo'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 14 (delta 3), reused 5 (delta 1), pack-reused 0
Receiving objects: 100% (14/14), done.
Resolving deltas: 100% (3/3), done.

# ... 

$ git push -u origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github-zad:andong2007/Excel.git
   4d73186..f2046f9  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

$

参考资料

<think>好的,我现在需要帮助用户解决如何在同一个文件夹下管理多个Git项目的问题。首先,我得仔细理解用户的需求。用户可能有一个主文件夹,里面包含了多个不同的子项目,每个子项目都需要独立使用Git进行版本控制,而互不干扰。这时候,用户需要知道如何正确配置和管理这些独立的Git仓库。 首先,我应该考虑常见的解决方案。通常,每个Git仓库都需要一个.git目录来存储版本控制信息。如果在同一个父文件夹下直接初始化多个Git仓库,可能会导致.git目录冲突,因为默认情况下,Git会在当前目录及其子目录中寻找.git文件夹。因此,正确的做法应该是在每个子项目文件夹中单独初始化Git,这样每个子项目都有自己的.git目录,彼此独立。 接下来,我需要回忆是否有相关的配置方法可以让Git识别不同的仓库。比如,用户提到的多个远程仓库配置,可能需要为每个子项目设置不同的远程地址。此外,引用[2]中提到了在同一个项目配置多个远程仓库的方法,这可能部分相关,但用户的问题是关于多个独立项目在同一个文件夹下的管理,而不是同一个项目有多个远程。 然后,考虑到用户可能希望保持文件夹结构整洁,可能需要使用子模块(submodule)或子树(subtree)。不过,子模块通常用于将一个Git仓库作为另一个仓库的子目录,这可能适用于项目之间存在依赖关系的情况。而如果用户的项目彼此独立,可能更合适的是直接在子文件夹中初始化独立的仓库。 另外,引用[3]提到了同一客户端配置多个Git账号的情况,这可能涉及到SSH密钥不同配置。如果用户需要为不同的子项目使用不同Git账户,可能需要为每个项目配置不同SSH密钥,或者使用不同的远程仓库地址。例如,在子项目A中使用账号A的密钥,子项目B中使用账号B的密钥,这需要在各自的.git/config文件中设置远程地址时指定对应的SSH密钥。 然后,我需要确保用户的操作步骤正确。例如,用户需要在每个子项目文件夹中运行git init,或者从远程仓库克隆时指定不同的目录。同时,为了避免全局配置的影响,可能需要为每个仓库设置局部配置,比如用户名和邮箱,这样每个项目提交时的作者信息可以不同。 此外,可能还需要处理.gitignore文件,确保父文件夹的忽略规则不会影响到子项目,或者每个子项目有自己的忽略规则。但通常每个子项目的.gitignore只影响其自身目录下的文件,所以这个问题可能不大。 总结一下,最佳实践应该是将每个子项目作为独立的Git仓库,每个都有自己的.git目录,并在需要时配置各自的远程仓库和SSH密钥。同时,可以通过git config命令在每个仓库中设置局部配置,避免全局配置的干扰。如果用户需要同时管理多个仓库的提交和推送,可以考虑使用脚本或工具来自动化这些操作,比如使用shell脚本遍历子目录执行Git命令。 最后,我需要验证这些步骤是否可行,是否有遗漏的地方。比如,确保每个子项目的.git目录正确初始化,远程仓库配置正确,以及SSH密钥正确关联。同时,提醒用户在操作时注意路径问题,避免在父文件夹中意外初始化Git仓库,导致子项目的管理混乱。</think>在同一个父文件夹下管理多个独立的 Git 项目,需遵循以下最佳实践: --- ### 1. **独立初始化仓库** 每个子项目**必须单独初始化 Git 仓库**,确保其拥有独立的`.git`目录。 **操作步骤**: ```bash # 创建父文件夹 mkdir parent_folder cd parent_folder # 为每个子项目单独初始化 mkdir projectA && cd projectA && git init && cd .. mkdir projectB && cd projectB && git init && cd .. ``` --- ### 2. **隔离远程仓库配置** 为每个子项目**单独配置远程仓库地址**,避免混淆。 **操作示例**: ```bash cd projectA git remote add origin git@github.com:user/projectA.git cd ../projectB git remote add origin git@github.com:user/projectB.git ``` 若需同一项目关联多个远程仓库(如同时推送到 GitHub 和 Gitee),可参考引用[2]的别名配置方法[^2]。 --- ### 3. **SSH 密钥区分(可选)** 若子项目需使用**不同 Git 账号**,需配置多套 SSH 密钥。 **实现方法**: - 在`~/.ssh/config`中为每个仓库指定密钥路径(参考引用[3])[^3]: ```config Host projectA-host HostName github.com User git IdentityFile ~/.ssh/id_rsa_projectA Host projectB-host HostName github.com User git IdentityFile ~/.ssh/id_rsa_projectB ``` - 修改子项目的远程地址: ```bash cd projectA git remote set-url origin git@projectA-host:user/projectA.git ``` --- ### 4. **局部 Git 配置覆盖** 通过`git config --local`为每个仓库**单独设置用户名/邮箱**: ```bash cd projectA git config user.name "UserA" git config user.email "usera@example.com" cd ../projectB git config user.name "UserB" git config user.email "userb@example.com" ``` --- ### 5. **批量操作工具** 使用脚本或工具(如`lerna`、`rush`)批量执行`git`命令: ```bash # 遍历所有子目录执行 git pull find . -maxdepth 1 -type d -exec sh -c 'cd {} && git pull' \; ``` --- ### § 相关问题 § 1. 如何避免父文件夹意外被初始化为 Git 仓库? 2. 如何统一管理多个 Git 子项目的依赖关系? 3. 如何解决多个子项目共用 `.gitignore` 规则的问题? --- **关键点总结**:通过**物理隔离仓库路径**、**独立配置远程地址**和**局部 Git 设置**,可实现多项目共存且互不干扰。若需跨仓库协作,可考虑 Git 子模块(`git submodule`)或引用[2]中的多远程仓库方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安冬的码畜日常

您的鼓励是我持续优质内容的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值