A&B #
场景:A 和 B 同时维护一个项目,B 电脑出问题了,在 A 电脑上改了代码后需要 push,但是 A 不想 B 用他的账号提交,所以需要添加新的 git 用户。
1、添加新用户的 sshkey
假设第一个 key 是
~/.ssh/id_rsa
现在创建第二个 key,用不同的名字(比如 id_rsa_work):
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_B -C "[email protected]"
这里的~为用户目录,可以使用 powershell 的 cd ~ 查看
# powershell
cd ~
pwd
C:\Users\yourusername
2、编辑 code ~/.ssh/config
如果没有则新建,添加如下内容
# 默认 GitHub 账号(id_rsa)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# 第二个 GitHub 账号(id_rsa_B)
Host B
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_B
测试是否正常工作
ssh -T github.com
ssh -T B
返回如下则正常工作
Hi another-user! You've successfully authenticated...
3、修改远程仓库地址 然后:
- 对于第一个账号克隆的仓库仍用
[email protected]:xxx/repo.git - 对于第二个账号克隆仓库时:
git@B:xxx/repo.git这样 Git 会根据 Host 自动选择 SSH key。
git remote -v
# 这里显示 origin git@github:USERNAME/REPO.git (fetch)
# 你需要替换github为第二个账号对应的 Host
git remote set-url origin git@B:USERNAME/REPO.git
# 验证
git remote -v
4、修改需要推送的仓库局部 B 的 git 用户名和邮箱
接着 在你需要推送的仓库中修改用户名和 email
git config --local user.name B
git config --local user.email [email protected]
最后就可以让 B 在 A 的电脑上提交 commits 了。
Appendix #
如果 B 使用 A 的 git 账号提交了怎么办?
Appendix.1、修改指定 A 提交为 B 提交 #
例如你想修改 commit hash 77f5a0 的作者A:
1、启动交互式 rebase(从要改的 commit 前一个开始)
git rebase -i 77f5a0^
2、编辑器修改:
pick 77f5a0 B的提交信息
改成:
edit 77f5a0 B的提交信息
保存退出。
3、此时 Git 会停在该提交,执行:
git commit --amend --author="B <[email protected]>"
4、继续 rebase:
git rebase --continue
完成后该 commit 的作者就被修改了。
Appendix.2、修改所有 A 提交为 B 提交 #
使用 git filter-branch,将某个人的所有提交统一改成另外一个身份 ⚠️:filter-branch 会彻底重写历史,请先备份仓库!
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="B"
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --all
检查+提交
git log
# 强推
git push --force --all # git push -f
git push --force --tags