跳过正文
  1. blog/

单电脑git多用户配置

·732 字·
Blog Linux Git
Aoidayo
作者
Aoidayo
懒人
目录

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

相关文章

Python算法项目 容器化
·585 字
Blog Linux Docker
Git 清除.git仓库历史记录中的高存储占用文件
·835 字
Blog Git