Change the author of a commit in Git

本文介绍了一个用于修改Git历史中特定提交作者名称及邮箱的脚本命令。通过使用此命令,可以将旧的提交者信息替换为新的信息,适用于需要更新作者信息的情况。

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

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

Note, if you are using this command in the Windows command prompt, then you need to use " instead of ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

转载:http://stackoverflow.com/questions/750172/change-the-author-of-a-commit-in-git
<think>我们注意到用户的问题是关于Git推送至Gerrit时出现"missingChange-Idincommitmessagefooter"的错误。根据Gerrit的工作流程,每个提交都需要一个唯一的Change-Id,该ID通常位于提交信息的最后一行,由Gerrit自动生成或通过commit-msg钩子添加。当缺失时,会导致推送失败。解决方案如下:步骤1:安装commit-msg钩子Gerrit提供了一个钩子脚本,用于在每次提交时自动生成Change-Id。安装方法如下:```bash#进入项目根目录cd/path/to/your/repository#下载钩子脚本(使用curl)curl-Lo.git/hooks/commit-msghttp://<gerrit-server>/tools/hooks/commit-msg#或者使用wgetwget-O.git/hooks/commit-msghttp://<gerrit-server>/tools/hooks/commit-msg#赋予执行权限chmodu+x.git/hooks/commit-msg```注意:将`<gerrit-server>`替换为实际的Gerrit服务器地址(例如:192.168.1.88:29418)。步骤2:为已存在的提交添加Change-Id如果已经提交的代码缺少Change-Id,可以通过以下步骤修复:方法A:修改最后一次提交(推荐)```bash#使用amend修改提交信息(会触发钩子自动添加Change-Id)gitcommit--amend```在打开的编辑器中,不要修改任何内容,直接保存退出。此时钩子会自动在提交信息末尾添加Change-Id。方法B:修改多个提交若多个提交缺失Change-Id,需使用交互式变基:```bash#变基最近n次提交(例如3次)gitrebase-iHEAD~3```在编辑器中,将需要修改的提交前的`pick`改为`reword`,保存退出。然后Git会逐个重新打开这些提交的编辑界面,同样不需要修改内容,直接保存退出即可,钩子会自动添加Change-Id。步骤3:验证提交信息使用`gitlog`查看最近的提交信息,确认Change-Id已存在:```bashgitlog-1```输出示例:```commit1234567890abcdef1234567890abcdef12345678Author:YourName<email@example.com>Date:ThuJan100:00:002023+0800YourcommitmessageChange-Id:I1234567890abcdef1234567890abcdef12345678```步骤4:重新推送至Gerrit使用正确的Gerrit推送命令:```bashgitpushoriginHEAD:refs/for/<target-branch>```例如,推送到master分支:```bashgitpushoriginHEAD:refs/for/master```注意事项:1.如果服务器钩子地址需要认证,请确保已配置好SSH密钥或HTTP认证。2.对于已经推送到Gerrit的提交,不建议使用`gitcommit--amend`修改(会生成新的提交哈希),除非该提交尚未被评审。如果问题仍然存在,请检查:-钩子脚本是否正确安装(检查.git/hooks/commit-md是否存在且有执行权限)-提交信息中是否包含Change-Id(使用`gitlog`查看)-Gerrit服务器配置(如钩子生成Change-Id的规则,需管理员确认)通过以上步骤,通常可以解决缺失Change-Id的问题[^1][^2]。§§相关问题§§1.如何配置Gerrit服务器以强制要求Change-Id?2.Git钩子脚本的工作原理是什么?3.如何修复Gerrit中的冲突提交?4.Gerrit的Change-Id与GitcommitID有何区别?</think>### 解决 Gerrit 推送错误:缺少 Change-Id 的完整方案 当 Git 推送至 Gerrit 时出现 **"missing Change-Id in commit message footer"** 错误,说明您的提交信息中缺少 Gerrit 必需的 Change-Id 标识符。以下是详细解决方案: --- #### 1. 安装 Gerrit commit-msg 钩子(最根本的解决方案) Gerrit 依赖钩子自动生成 Change-Id,安装步骤如下: ```bash # 进入项目根目录 cd /path/to/your/repo # 下载 Gerrit 提供的钩子脚本(替换为您的 Gerrit 地址) curl -Lo .git/hooks/commit-msg http://192.168.1.88:29418/tools/hooks/commit-msg # 添加执行权限 chmod u+x .git/hooks/commit-msg ``` > ✅ 安装后,所有新提交将自动在信息末尾添加 Change-Id[^1] --- #### 2. 修复现有提交的 Change-Id 对于已提交但缺少 Change-Id 的提交: **方法 1:修改最后一次提交** ```bash git commit --amend # 不修改内容,直接保存退出 ``` 钩子会自动添加 Change-Id,验证: ```bash git log -1 # 查看末尾是否有 "Change-Id: Ixxx..." # 示例输出: # Commit: 5a8b3f2 # Author: user <user@example.com> # Date: Thu Jan 1 00:00:00 2023 +0800 # # Fix nsh plugin bug # # Change-Id: Ica2a4677e1f0690e449b3d4e35e2856a2a5b1c4d ``` **方法 2:修复多个提交(交互式变基)** ```bash git rebase -i HEAD~3 # 修改最近3个提交 ``` 将需要修复的提交前的 `pick` 改为 `reword`,保存后 Git 会逐个打开提交信息编辑器,直接保存退出即可添加 Change-Id。 --- #### 3. 手动添加 Change-Id(临时方案) 如果无法安装钩子,可手动添加: 1. 生成随机 Change-Id: ```bash echo "Change-Id: I$(uuidgen | tr '[:upper:]' '[:lower:]')" >> .git/COMMIT_EDITMSG ``` 2. 提交时包含该标识符: ``` Fixed network handling This patch fixes the packet loss issue in nsh.c Change-Id: Ica2a4677e1f0690e449b3d4e35e2856a2a5b1c4d ``` --- #### 4. 验证并推送 ```bash # 检查 Change-Id 是否存在 git log --pretty=fuller # 正确推送至 Gerrit git push origin HEAD:refs/for/5805PRO # 注意 refs/for/ 前缀 ``` --- #### 关键注意事项: 1. **Change-Id 位置**:必须位于提交信息末尾,且独占一行 2. **格式要求**:以 `Change-Id: I` 开头,后跟 40 字符哈希(如 `Ica2a4677e1f0690e449b3d4e35e2856a2a5b1c4d`) 3. **权限问题**:若同时遇到权限错误,需联系管理员确认: - 对 `refs/for/*` 有 Push 权限 - Java 环境符合要求(Gerrit 需 JRE 8)[^2] > ⚠️ 直接推送到分支(如 `git push origin 5805PRO`)会触发权限错误,必须使用 `refs/for/<branch>` 格式 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值