You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用git send-email发送补丁后,如何提取并合并邮箱中的补丁?

解决Git补丁邮件无法提取合并的问题

我来帮你搞定这个问题,分三步走:先处理现有纯文本邮件里的补丁提取合并,再教你正确发送能被Git直接识别的补丁,最后说下对方怎么简便合并。

一、从现有纯文本邮件中提取并合并补丁

邮件里的纯文本其实已经包含了完整补丁内容,只是混在了邮件正文里,你可以这样提取:

  • 打开收到的邮件,找到正文里从diff --git开头到结尾的补丁片段,把这段完整复制下来(注意跳过邮件头、签名、问候语这些无关内容)
  • 在本地新建一个文件,比如my-fix.patch,把复制的补丁内容粘贴进去并保存
  • 切换到你的Git仓库目录,先测试补丁能否正常应用:
    git apply --check my-fix.patch
    
    如果没有报错,说明补丁没问题,接着用下面的命令合并:
    # 方式1:直接应用补丁,之后需要手动提交
    git apply my-fix.patch
    git add .
    git commit -m "Apply patch from email"
    
    # 方式2:用git am直接生成对应提交(推荐,会保留原补丁的提交信息)
    git am my-fix.patch
    

二、正确发送可被Git识别的补丁

你之前发送后变成纯文本,大概率是补丁格式或发送配置的问题,按下面的步骤操作就能让对方直接用Git命令合并:

1. 用Git规范生成补丁文件

先确保你的补丁是通过git format-patch生成的,这是Git官方推荐的格式,自带邮件兼容的头信息:

# 生成最近1次提交的补丁文件
git format-patch -1
# 生成最近N次提交的补丁,会生成N个独立的.patch文件
git format-patch -N

生成的补丁文件会包含[PATCH]前缀的主题、提交作者、提交信息等,Git工具能直接识别。

2. 配置Git Send-Email(以Gmail为例)

如果是第一次用git send-email,需要先配置SMTP信息(Gmail需要开启两步验证并创建应用密码):

git config --global sendemail.smtpServer smtp.gmail.com
git config --global sendemail.smtpServerPort 587
git config --global sendemail.smtpUser "your-gmail-account@gmail.com"
git config --global sendemail.smtpPass "your-app-password"
git config --global sendemail.confirm always
git config --global sendemail.smtpEncryption tls

3. 发送补丁

直接用git send-email发送生成的.patch文件,默认会把补丁内容作为带规范格式的邮件正文发送,对方可以直接用git am处理:

git send-email --to a1105773737@gmail.com ~/patches/*.patch

如果还是担心变成纯文本,可以强制将补丁作为附件发送:

git send-email --attach --to a1105773737@gmail.com ~/patches/*.patch

三、对方合并补丁的简便方法

如果按上面的规范发送,对方只需要:

  • 如果补丁在邮件正文:把邮件保存为.eml文件,然后在仓库执行git am path/to/your-email.eml,Git会自动提取补丁并创建对应的提交
  • 如果补丁是附件:下载.patch附件,执行git am downloaded-patch.patch即可完成合并

内容的提问来源于stack exchange,提问作者chezi chezi

火山引擎 最新活动