如何配置和使用`git send-email`与Gmail一起发送补丁给开发者的电子邮件。

24
如何配置git send-email与gmail一起使用?

我想要为 glibcGNU C 库,不要与 GNOME 的 GLib 库混淆)做贡献,例如更新 glibc/benchtests/bench-malloc-thread.c 的 malloc 速度测试 benchtest,但它们过时且陈旧,在仍然停留在黑暗时代的地方我们必须通过电子邮件和命令行提交补丁,而不是通过 GitHub 或 GitLab 开启 Pull Request。:)

请参阅 glibc 的贡献说明:https://sourceware.org/glibc/wiki/Contribution%20checklist

创建一个或多个补丁,使用git format-patch 使用git send-email --to=libc-alpha@sourceware.org将补丁发送到列表,使用--cc在需要时引起特定维护者的注意。 如果您的补丁尚未被审核,请每周至少发起一次催促。
  1. git: 'send-email' 不是一个 git 命令。请参阅 'git --help'
  2. https://coderwall.com/p/qcsiew/setting-up-and-using-git-send-email-with-gmail
  3. https://coderwall.com/p/dp-gka/setting-up-git-send-email-with-gmail
  4. https://git-scm.com/docs/git-send-email#_use_gmail_as_the_smtp_server
  5. https://git-scm.com/docs/git-credential
  6. https://gist.github.com/jasonkarns/4354421
  7. https://gist.github.com/winksaville/dd69a860d0d05298d1945ceff048ce46
  8. 2023年4月8日添加,根据 @mcepl 在这个已删除的回答中:[也不完整] https://git-send-email.io/

注意:另一个需要使用git send-email来贡献补丁的项目是Buildroot(参见这里:https://buildroot.org/downloads/manual/manual.html#submitting-patches),它用于构建定制的嵌入式Linux发行版。因此,如果你也想弄清楚如何在Buildroot中做到这一点,请参考我的答案
1个回答

55
开发者和维护者们注意,对于需要使用git send-email发送补丁的glibc、Buildroot和其他项目,如果我不是一名专业开发者,即使我知道如何编写高级代码并进行重要的更改,我也不可能提交补丁。进入git、rebase、格式化补丁、配置git send-email等的门槛太高了。考虑通过使用现代工具,如GitHub、GitLab或BitBucket来管理项目并接受补丁,以降低进入门槛,而不是使用电子邮件补丁、邮件列表和git send-email。一个最近成功的案例是KiCad。在2020年,他们仍在使用电子邮件git补丁。现在,他们已完全迁移到GitLab:https://gitlab.com/kicad。例如,他们的问题报告和管理现在非常容易:https://gitlab.com/kicad/code/kicad/-/issues。即使是非程序员的普通用户现在也能轻松报告问题,而以前,KiCad使用的是https://launchpad.net/kicad,那更加繁琐和困难。

至少,请帮助他人并引导他们查看此答案,以帮助他们设置git send-email,并保持此答案的最新状态。

如何配置和使用git send-email与gmail

经过大量努力,并利用问题底部的所有资源,我能够从所有来源的组合中拼凑出一个解决方案。请耐心等待。

在Ubuntu 20.04上进行了测试。

  1. 安装git send-email

    sudo apt update
    sudo apt install git-email
    

    来源:git: 'send-email' is not a git command. See 'git --help' 如果没有进行上述安装,你会看到:

    git: 'send-email' is not a git command. See 'git --help'.
    
  2. 安装Perl脚本依赖项(Perl必须已经安装):

    cpan Authen::SASL MIME::Base64 Net::SMTP::SSL
    

    来源:https://coderwall.com/p/qcsiew/setting-up-and-using-git-send-email-with-gmail

  3. 通过确保~/.gitconfig文件中有以下内容来配置:

    [user]
        name = First Last
        email = my_email@gmail.com
    [sendemail]
        smtpServer = smtp.gmail.com
        smtpServerPort = 587
        smtpEncryption = tls
        smtpUser = my_email@gmail.com
        #(可选:我们将保留此注释并使用其他方法)
        # smtpPass = PASSWORD
    [credential]
        helper = store
    

    来源:多个地方,但唯一一个说要添加[credential]部分(非常重要)的是这个:https://gist.github.com/winksaville/dd69a860d0d05298d1945ceff048ce46

  4. 配置你的Google帐户,使其具有1)双重身份验证(以启用应用程序特定密码),以及2)供git send-email使用的gmail的应用程序特定密码

    1. 配置双重身份验证:访问此处:https://myaccount.google.com/security --> 向下滚动到“2步验证”并按照流程打开它。
    2. 为git生成一个用于gmail的应用程序特定密码:转到上面的链接,点击“2步验证”页面(直接链接:https://myaccount.google.com/signinoptions/two-step-verification),向下滚动到“应用程序密码”并点击它。(或者转到这里:https://myaccount.google.com/apppasswords)选择“Mail”作为应用程序:enter image description here 选择“其他(自定义名称)”作为设备:enter image description here
      并将其命名为git send-email或类似的名称。点击“GENERATE”按钮。它将弹出一个16位的完全访问密码。将其写下来,不要带有空格。它只是16个字符。
  5. 如果需要,将要作为补丁发送的提交合并为一个提交。有多种合并技术,但下面是一种常见的方法:

    # 将从`my_first_commit`到`HEAD`(最新提交)的所有提交合并为一个。
    # 包括。
    git rebase -i my_first_commit~  # 不要忘记末尾的波浪号(~)!
    # 在打开的git编辑器中,将第一个条目手动设置为“pick”,然后将所有其他条目设置为“squash”或简写为“s”。
    # 保存,然后关闭编辑器并进行合并。
    

    有关其他合并技术,请参阅我的个人笔记文档git & Linux cmds, help, tips & tricks - Gabriel.txt,位于我的eRCaGuy_dotfiles存储库中。在该文件中搜索以下短语:

    1. == TWO WAYS TO SQUASH ==
    2. CONCISE SQUASH SUMMARY
    3. MORE-DETAILED REBASE AND SQUASH NOTES
  6. 为最新的合并提交创建一个补丁文件:

    git format-patch -1 HEAD
    

    这将生成一个补丁文件。例如:0001-bench-malloc-thread.c-add-assert-that-malloc-is-neve.patch

  7. 将该补丁文件发送到需要发送的位置。作为初始测试,让我们将其发送到你自己的邮箱my_email@gmail.com

    git send-email --to=my_email@gmail.com 0001-bench-malloc-thread.c-add-assert-that-malloc-is-neve.patch
    

    将显示有关邮件的信息,然后在末尾会有以下内容:

    Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll):
    

    输入y并按Enter键发送消息。第一次使用git send-email发送邮件时,它将提示你输入密码。使用你为上面的Google帐户生成的应用程序特定密码,并发送邮件。

    由于你在上面的~/.gitconfig文件中添加了[credential] helper = store条目,git现在会自动将你的应用程序特定密码保存在一个名为~/.git-credentials的新文件中。如果你打开该文件,你会看到一个URL字符串,其中包含你的密码明文。它看起来像这样:

    smtp://EMAIL%40gmail.com:16-DIGIT-PASSWORD@smtp.gmail.com%3a587
    

    其中EMAIL是你的电子邮件地址中@符号之前的部分,16-DIGIT-PASSWORD是你之前为你的Google帐户生成的16位应用程序特定密码。

    希望你的硬盘已加密(你应该在首次安装Ubuntu时选择了LUKS加密,以进行全盘加密),并且你是计算机上唯一的root用户。如果是这种情况,这不是一个安全问题,因为ll ~/.git-credentials显示-rw------- 1 your_username your_groupname,这意味着该文件只能被你阅读。

  8. 完成!下次运行git send-email时,你将无需输入应用程序密码,因为它现在保存在~/.git-credentials中。

参考资料

  1. 请参考问题底部的所有参考资料,以及我自己的大量研究和试错。

8
感谢您把所有信息整理在一起。每一个信息都可以在某个地方找到,但是整理和测试显然需要很多工作。 - torek
1
我不同意你一开始的评估。我认为发送电子邮件比分叉和拉取请求容易1000倍。抱歉。 - Sukima
2
@Sukima,现代系统的一个重要优势是问题报告和跟踪功能,这也是需要考虑的另一件事。在旧的基于Web的工具中,这方面处理得不够好,而且通过电子邮件处理问题非常糟糕。通过电子邮件进行协作更加困难,特别是想要触达更广泛的受众。 - Gabriel Staples
1
非常感谢您提供这个一站式答案,以完成这样一个任务,我可能需要参考五个不同的资料才能做到正确。特别是在设置Gmail时,似乎非常麻烦,但是您让它变得轻而易举。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接