如何配置Git实现双仓库提交者身份双向替换?
解决双Git仓库提交者信息替换问题
核心思路
通过重写提交历史,将对方仓库中非你本人的提交,替换成你的姓名和邮箱后再推送到另一个仓库;自己的提交直接同步即可。
操作步骤(以两个仓库分别命名为repoA、repoB为例)
1. 初始化本地仓库并关联两个远程
# 先克隆其中一个仓库到本地 git clone <repoA的仓库地址> my-project cd my-project # 添加另一个仓库作为远程源 git remote add repoB <repoB的仓库地址>
2. 同步repoA中他人的提交到repoB(转为你的提交)
- 拉取repoA的最新代码:
git fetch repoA - 创建临时分支,基于repoA的主分支(假设主分支名为
main):git checkout -b temp-repoA repoA/main - 批量修改临时分支上非你本人的提交信息:
git filter-branch --env-filter ' # 替换成你的姓名和邮箱 CORRECT_NAME="你的名字" CORRECT_EMAIL="你的邮箱地址" # 若提交者不是你,替换为你的信息 if [ "$GIT_COMMITTER_EMAIL" != "$CORRECT_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" != "$CORRECT_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' -- temp-repoA - 将修改后的临时分支合并到本地主分支,再推送到repoB:
git checkout main git merge temp-repoA --no-ff git push repoB main - 清理临时分支(可选):
git branch -D temp-repoA
3. 同步repoB中他人的提交到repoA(转为你的提交)
操作逻辑和上面完全一致,仅替换远程名即可:
# 拉取repoB最新代码 git fetch repoB # 创建临时分支 git checkout -b temp-repoB repoB/main # 批量替换提交信息(代码和上面一样,不用改) git filter-branch --env-filter ' CORRECT_NAME="你的名字" CORRECT_EMAIL="你的邮箱地址" if [ "$GIT_COMMITTER_EMAIL" != "$CORRECT_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" != "$CORRECT_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' -- temp-repoB # 合并并推送 git checkout main git merge temp-repoB --no-ff git push repoA main # 清理临时分支 git branch -D temp-repoB
4. 同步你自己的提交到两个仓库
你自己开发的代码,直接在本地主分支提交后,推送到两个远程即可:
# 提交本地改动 git add . git commit -m "你的提交说明" # 推送到两个仓库 git push repoA main git push repoB main
重要注意事项
git filter-branch会重写提交历史,推送时如果远程仓库已有这些提交,可能需要加-f强制推送(git push -f repoB main),但一定要提前和对应仓库的维护者沟通,避免覆盖他人未同步的改动。- 操作前建议备份本地仓库和远程仓库,防止误操作导致代码丢失。
- 如果两个仓库的主分支不是
main,替换成实际分支名(比如master)即可。
内容的提问来源于stack exchange,提问作者levi-jcbs
相关产品推荐
相关产品推荐

