资讯详情

分布式 Git - 为项目做贡献

为项目做出贡献

  • 提交准则
  • 私人小团队
  • 私人管理团队
  • 分叉公共项目
  • 通过电子邮件公开项目
  • 总结
描述如何为项目做出贡献的主要困难是如何做出许多变化。 Git 非常灵活,人们可以以各种方式一起工作,描述你应该如何做出贡献——每个项目都有点不同。一些涉及的变量包括活动参与者的计数、选定的工作流程、提交访问权限和可能的外部贡献者方法。

第一个变量是活动贡献者的计数 — 有多少用户积极为这个项目贡献代码,贡献多久?在很多情况下,你每天会有两三个开发人员提交几个,或者对于一些休眠项目,可能会更少。对于大型公司或项目,开发人员的数量可能达到数千人,每天提交数百人或数千人。这是非常重要的,因为随着越来越多的开发人员,你会遇到更多的问题,以确保代码干净应用或容易合并。由于您的工作或等待批准或应用时合并的工作,您提交的更改可能会过时或严重中断。如何使代码保持最新状态并有效提交?

下一个变量用于项目的工作流。是集中的吗?每个开发人员对主代码线都有平等的写入权限?项目是否有维护人员或集成经理检查所有补丁?所有补丁都是同行审批的吗?你参与过程吗?中尉制度到位了吗?你必须先向他们提交你的工作吗?

下一个变量是提交访问权限。如果您有项目的写入权限,那么为项目做出贡献所需的工作流与未写入权限时的工作流程大不相同。如果您没有写入权限,项目如何更愿意接受贡献?它甚至有政策吗?你一次贡献了多少工作?你贡献了多久?

所有这些问题都会影响你如何有效地为项目做出贡献,以及哪些工作流程是首选或可用的。我们将介绍一系列例子的各个方面,从简单到更复杂;你应该能够从这些例子中构建实践中需要的具体工作流。

提交准则

在我们开始查看具体用例之前,以下是提交信息的快速说明。有一个很好的创建、提交和坚持的指南,使用Git更容易与他人合作。Git 该项目提供了一份文件,列出了许多提交补丁的创建提示 — 你可以在文件中 Git 在源代码中读取。Documentation/SubmittingPatches

首先,您的提交不应包含任何空间错误。Git 检查这个问题提供了一个简单的方法 — 运行前提交 ,它可以识别可能的空间错误并为您列出它们。git diff --check 在这里插入图片描述 如果该命令在提交前运行,则可以判断是否要提交,这可能会惹恼其他开发人员。

接下来,试着在逻辑上使每个提交都是一个单独的变更集。如果可以的话,试着让你的变化易于消化——不要在五个不同的问题上为整个周末编写代码,然后在周一大规模提交。即使你在周末不提交,你也可以使用周一的临时存储区域将工作分成至少一个问题,每个提交都有一个有用的信息。如果修改了相同的文件,请尝试使用 暂存文件(详细介绍交互式暂存)。无论您执行一次提交还是五次提交,分支顶部的项目快照都是相同的,只要在某个时刻添加了所有更改,因此,当您的开发人员必须查看您的更改时,请尝试使其他开发人员更容易。git add --patch

这种方法还可以在将来需要时更容易地拉出或恢复变更集。重写历史记录描述了许多有用的东西 Git 该技能用于重写历史记录和交互式暂存文件 — 用这些工具帮助制作干净易懂的历史记录,然后把工作发给别人。

最后要记住的是提交信息。养成高质量提交信息的习惯,使用与合作 Git 变得更容易。作为一般规则,您的邮件不得超过约定 50 一行字符的开头,简明扼要地描述变更集,然后空行,再详细描述。Git 项目需要更详细的解释,包括你对变化的动机,并将其实现与以前的行为进行比较 — 这是一个很好的遵循标准。写下你的提交信息:修复错误,而不是修复错误或修复错误。

私人小团队

你可能遇到的最简单的设置是一个私人项目,包括一两个其他开发人员。在这种情况下,私有意味着闭源——外部世界无法访问。您和其他开发人员都有权推送访问存储库。

在这种环境下,您可以遵循类似的使用方法 Subversion 或者其他集中系统可能执行的工作流。您仍然可以获得离线提交和更简单的分支和合并,但工作流程可能非常相似;主要区别在于合并在客户端而不是服务器上。让我们看看两个开发人员开始使用共享存储时会是什么样子。第一个开发人员 John 克隆仓库,变更,并在当地提交。在这些例子中,为了缩短它们,已经替换了协议消息。…

# John's Machine $ git clone john@githost:simplegit.git Cloning into 'simplegit'... ... $ cd simplegit/ $ vim lib/simplegit.rb $ git commit -am 'Remove invalid default value' [master 738ee87] Remove invalid default value  1 files changed, 1 insertions( ), 1 deletions(-) 

第二个开发人员Jessica做同样的事 —— 克隆存储库并提交更改:

# Jessica's Machine $ git clone jessica@githost:simplegit.git Cloning into 'simplegit'... ...$ cd simplegit/
$ vim TODO
$ git commit -am 'Add reset task'
[master fbff5bc] Add reset task
 1 files changed, 1 insertions(+), 0 deletions(-)

现在,Jessica 将她的工作推送到服务器,这工作正常:

# Jessica's Machine
$ git push origin master
...
To jessica@githost:simplegit.git
   1edee6b..fbff5bc  master -> master

上面输出的最后一行显示了来自推送操作的有用返回消息。基本格式为 ,其中表示旧引用,表示新引用,是正在推送的本地引用的名称,并且是正在更新的远程引用的名称。您将在下面的讨论中看到类似的输出,因此对含义有一个基本的想法将有助于理解存储库的各种状态。有关 git-push 的文档提供了更多详细信息。… fromref → torefoldrefnewreffromreftoref

继续此示例,不久之后,John 进行了一些更改,将它们提交到他的本地存储库,并尝试将它们推送到同一服务器:

# John's Machine
$ git push origin master
To john@githost:simplegit.git
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to 'john@githost:simplegit.git'

在这种情况下,约翰的推动失败了,因为杰西卡早些时候推动了她的改变。如果您习惯于 Subversion,了解这一点尤其重要,因为您会注意到这两个开发人员没有编辑同一个文件。尽管如果编辑了不同的文件,Subversion 会自动在服务器上执行此类合并,但对于 Git,您必须首先在本地合并提交。换句话说,John 必须首先获取 Jessica 的上游更改,并将它们合并到他的本地存储库中,然后才能允许他推送。

作为第一步,约翰获取了杰西卡的工作(这只提取了杰西卡的上游工作,它还没有将其合并到约翰的工作中):

$ git fetch origin
...
From john@githost:simplegit
 + 049d078...fbff5bc master     -> origin/master

此时,John 的本地存储库如下所示: 现在,约翰可以将杰西卡的作品合并到他自己的本地作品中:

$ git merge origin/master
Merge made by the 'recursive' strategy.
 TODO |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

只要本地合并顺利进行,John 的更新历史记录现在将如下所示: 在这一点上,John 可能想要测试这个新代码,以确保 Jessica 的工作不会影响他的任何工作,只要一切看起来都没问题,他最终可以将新的合并工作推送到服务器:

$ git push origin master
...
To john@githost:simplegit.git
   fbff5bc..72bbc59  master -> master

最后,John 的提交历史记录将如下所示: 与此同时,Jessica 创建了一个名为 的新主题分支,并对该分支进行了三次提交。她尚未获取 John 的更改,因此她的提交历史记录如下所示:issue54 突然,杰西卡得知 John 已经向服务器推送了一些新工作,她想看一看,这样她就可以从服务器中获取她还没有的所有新内容:

$ git fetch origin
...
From jessica@githost:simplegit
   fbff5bc..72bbc59  master     -> origin/master

这拉低了约翰在此期间推动的工作。杰西卡的历史现在看起来像这样: 杰西卡认为她的主题分支已经准备好了,但她想知道约翰的哪一部分工作她必须合并到她的作品中,以便她可以推动。她跑去发现:git log

$ git log --no-merges issue54..origin/master
commit 738ee872852dfaa9d6634e0dea7a324040193016
Author: John Smith <xqcom>
Date:   Fri May 29 16:01:27 2021 -0700

Remove invalid default value 语法是一个日志过滤器,它要求 Git 仅显示位于后一个分支(在本例中)上但不在第一个分支(在本例中)的提交。我们将在提交范围中详细介绍此语法。issue54…origin/masterorigin/masterissue54

从上面的输出中,我们可以看到 John 所做的一个提交,Jessica 没有合并到她的本地工作中。如果她合并,那就是修改她的本地工作的单一提交。origin/master

现在,Jessica 可以将她的主题工作合并到她的分支中,将 John 的工作 () 合并到她的分支中,然后再次推送回服务器。masterorigin/mastermaster

首先(在她的主题分支上完成了所有工作之后),Jessica切换回她的分支,准备整合所有这些工作:issue54master

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.

杰西卡可以合并任何一个,也可以先合并——它们都在上游,所以顺序并不重要。无论她选择哪种顺序,结束快照都应该是相同的;只是历史会有所不同。她选择先合并分支:origin/masterissue54issue54

$ git merge issue54
Updating fbff5bc..4af4298
Fast forward
 README           |    1 +
 lib/simplegit.rb |    6 +++++-
 2 files changed, 6 insertions(+), 1 deletions(-)

没有问题发生;正如你所看到的,这是一个简单的快进合并。Jessica 现在通过合并 John 之前在分支中获取的工作来完成本地合并过程:origin/master

$ git merge origin/master
Auto-merging lib/simplegit.rb
Merge made by the 'recursive' strategy.
 lib/simplegit.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

一切都干净利落地融合在一起,杰西卡的历史现在看起来像这样:

现在可以通过Jessica的分支到达,所以她应该能够成功推动(假设John在此期间没有推动更多的变化):origin/mastermaster

$ git push origin master
...
To jessica@githost:simplegit.git
   72bbc59..8059c15  master -> master

每个开发人员都承诺了几次,并成功地合并了彼此的工作。

这是最简单的工作流程之一。您工作一段时间(通常在主题分支中),并在准备好集成时将其合并到您的分支中。当您想要共享该工作时,如果工作已更改,则可以提取并合并您的工作,最后推送到服务器上的分支。一般顺序如下:mastermasterorigin/mastermaster

私人管理团队

在下一个方案中,你将查看较大专用组中的参与者角色。您将学习如何在小组协作处理功能的环境中工作,之后这些基于团队的贡献将由另一方集成。

假设 John 和 Jessica 正在合作开发一个功能(称为“featureA”),而 Jessica 和第三个开发人员 Josie 正在开发第二个功能(例如“featureB”)。在这种情况下,公司正在使用一种集成管理器工作流,其中各个组的工作仅由某些工程师集成,并且主存储库的分支只能由这些工程师更新。在此方案中,所有工作都在基于团队的分支中完成,并由集成商稍后完成。master

让我们跟随 Jessica 的工作流程,了解她的两个功能,在此环境中与两个不同的开发人员并行协作。假设她已经克隆了她的存储库,她决定先处理。她为该功能创建了一个新分支,并在那里做了一些工作:featureA

# Jessica's Machine
$ git checkout -b featureA
Switched to a new branch 'featureA'
$ vim lib/simplegit.rb
$ git commit -am 'Add limit to log function'
[featureA 3300904] Add limit to log function
 1 files changed, 1 insertions(+), 1 deletions(-)

此时,她需要与 John 共享她的工作,因此她将分支提交推送到服务器。Jessica 没有推送对分支的访问权限 - 只有集成商有 - 所以她必须推送到另一个分支才能与 John 合作:featureAmaster

$ git push -u origin featureA
...
To jessica@githost:simplegit.git
 * [new branch]      featureA -> featureA

杰西卡给约翰发了电子邮件,告诉他她已经把一些工作推到了一个名为的分支上,他现在可以看看了。在等待约翰的反馈时,杰西卡决定开始与乔茜合作。首先,她启动了一个新的功能分支,基于服务器的分支:featureAfeatureBmaster

# Jessica's Machine
$ git fetch origin
$ git checkout -b featureB origin/master
Switched to a new branch 'featureB'

现在,Jessica 在分支上做了几个提交:featureB

$ vim lib/simplegit.rb
$ git commit -am 'Make ls-tree function recursive'
[featureB e5b0fdc] Make ls-tree function recursive
 1 files changed, 1 insertions(+), 1 deletions(-)
$ vim lib/simplegit.rb
$ git commit -am 'Add ls-files'
[featureB 8512791] Add ls-files
 1 files changed, 5 insertions(+), 0 deletions(-)

Jessica 的存储库现在如下所示: 她准备推动自己的工作,但收到Josie的电子邮件,说一个具有初始“featureB”工作的分支已经作为分支推送到服务器。Jessica 需要将这些更改与她自己的更改合并,然后才能将工作推送到服务器。杰西卡首先获取乔西的变化:featureBeegit fetch

$ git fetch origin
...
From jessica@githost:simplegit
 * [new branch]      featureBee -> origin/featureBee

假设Jessica仍在她签出的分支中,她现在可以将Josie的工作合并到该分支中:featureBgit merge

$ git merge origin/featureBee
Auto-merging lib/simplegit.rb
Merge made by the 'recursive' strategy.
 lib/simplegit.rb |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

在这一点上,Jessica希望将所有这些合并的“featureB”工作推送回服务器,但她不想简单地推送自己的分支。相反,由于Josie已经开始了上游分支,Jessica希望推动该分支,她这样做:featureBfeatureBee

$ git push -u origin featureB:featureBee
...
To jessica@githost:simplegit.git
   fba9af8..cd685d1  featureB -> featureBee

这称为引用规范。请参阅 Refspec,更详细地讨论 Git refspecs 以及您可以使用它们执行的不同操作。还要注意旗帜;这是 的缩写,它配置了分支以便以后更容易地推拉。-u–set-upstream

突然,杰西卡收到了约翰的电子邮件,约翰告诉她,他已经对他们正在合作的分支进行了一些更改,他要求杰西卡看看它们。同样,Jessica运行了一个简单的程序,从服务器获取所有新内容,当然包括(当然)John的最新作品:featureAgit fetch

$ git fetch origin
...
From jessica@githost:simplegit
   3300904..aad881d  featureA   -> origin/featureA

Jessica 可以通过将新获取的分支的内容与同一分支的本地副本进行比较来显示 John 新工作的日志:featureA

$ git log featureA..origin/featureA
commit aad881d154acdaeb2b6b18ea0e827ed8a6d671e6
Author: John Smith <xq.com>
Date:   Fri May 29 19:57:33 2021 -0700
Increase log output to 30 from 25

如果Jessica喜欢她所看到的,她可以将John的新作品合并到她当地的分支机构中:featureA

$ git checkout featureA
Switched to branch 'featureA'
$ git merge origin/featureA
Updating 3300904..aad881d
Fast forward
 lib/simplegit.rb |   10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)

最后,Jessica 可能希望对所有合并的内容进行一些小的更改,以便她可以自由地进行这些更改,将它们提交到她的本地分支,并将最终结果推送回服务器:featureA

$ git commit -am 'Add small tweak to merged content'
[featureA 774b3ed] Add small tweak to merged content
 1 files changed, 1 insertions(+), 1 deletions(-)
$ git push
...
To jessica@githost:simplegit.git
   3300904..774b3ed  featureA -> featureA

Jessica 的提交历史记录现在如下所示: 在某个时候,Jessica、Josie 和 John 通知集成商,服务器上的 和 分支已准备好集成到主线中。在集成商将这些分支合并到主线之后,获取将关闭新的合并提交,使历史记录如下所示:featureAfeatureBee 许多组切换到 Git 是因为这种能力让多个团队并行工作,在流程后期合并不同的工作线。团队中较小的子组能够通过远程分支进行协作,而不必涉及或阻碍整个团队,这是Git的一个巨大优势。您在此处看到的工作流的顺序如下所示:

分叉公共项目

为公共项目做出贡献有点不同。因为你没有权限直接更新项目的分支,所以你必须以其他方式将工作交给维护者。第一个示例描述了在支持轻松分叉的 Git 主机上通过分叉来贡献。许多托管网站都支持这一点(包括GitHub,BitBucket,repo.or.cz 等),许多项目维护者都希望这种贡献。下一节将介绍那些喜欢通过电子邮件接受贡献补丁的项目。

首先,您可能希望克隆主存储库,为您计划贡献的补丁或补丁系列创建主题分支,并在那里完成工作。序列基本上看起来像这样:

$ git clone <url>
$ cd project
$ git checkout -b featureA
  ... work ...
$ git commit
  ... work ...
$ git commit

当你的分支工作完成,你准备把它贡献给维护者时,转到原始项目页面,点击“Fork”按钮,创建你自己的项目可写分支。然后,您需要将此存储库 URL 添加为本地存储库的新远程站点;在这个例子中,我们称之为:myfork

$ git remote add myfork <url>

然后,您需要将新工作推送到此存储库。最简单的方法是将您正在处理的主题分支推送到分叉存储库,而不是将该工作合并到您的分支中并推送它。原因是,如果您的工作未被接受或被精心挑选,则不必倒带您的分支(Git操作在重新定基和挑选工作流中有更详细的介绍)。如果维护者,或者你的工作,你最终会通过从他们的存储库中提取它来找回它。mastermastercherry-pickmergerebasecherry-pick

无论如何,您都可以通过以下方式推送您的工作:

$ git push -u myfork featureA

一旦你的工作被推送到你的仓库,你需要通知原始项目的维护者,你有希望他们合并的工作。这通常被称为拉取请求,您通常通过网站生成此类请求 - GitHub有自己的“拉取请求”机制,我们将在GitHub中介绍 - 或者您可以运行命令并手动将后续输出通过电子邮件发送给项目维护者。git request-pull

该命令获取要将主题分支拉入的基本分支以及希望它们从中拉取的 Git 存储库 URL,并生成您要求提取的所有更改的摘要。例如,如果 Jessica 想要向 John 发送拉取请求,并且她已在刚刚推送的主题分支上完成了两次提交,则可以运行以下命令:git request-pull

$ git request-pull origin/master myfork
The following changes since commit 1edee6b1d61823a2de3b09c160d7080b8d1b3a40:
Jessica Smith (1):
        Create new function

are available in the git repository at:

  git://githost/simplegit.git featureA

Jessica Smith (2):
      Add limit to log function
      Increase log output to 30 from 25

 lib/simplegit.rb |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

这个输出可以发送给维护者——它告诉他们工作是从哪里分支过来的,总结了提交,并确定了新工作要从哪里拉出来。

在你不是维护者的项目中,通常更容易让一个分支像总是跟踪一样,并在主题分支中完成你的工作,如果它们被拒绝,你可以很容易地丢弃它们。将工作主题隔离到主题分支中,如果主存储库的提示在此期间移动并且您的提交不再干净地应用,也可以使您更轻松地重新确定工作的基础。例如,如果您想向项目提交第二个工作主题,请不要继续处理您刚刚推送的主题分支 - 从主存储库的分支重新开始:masterorigin/mastermaster

$ git checkout -b featureB origin/master
  ... work ...
$ git commit
$ git push myfork featureB
$ git request-pull origin/master myfork
  ... email generated request pull to maintainer ...
$ git fetch origin

现在,您的每个主题都包含在一个孤岛中 - 类似于补丁队列 - 您可以重写,变基和修改,而不会相互干扰或相互依赖主题,如下所示: 假设项目维护者已经拉入了一堆其他补丁并尝试了你的第一个分支,但它不再干净地合并。在这种情况下,您可以尝试在 之上重定该分支的基态,为维护者解决冲突,然后重新提交更改:origin/master

$ git checkout featureA
$ git rebase origin/master
$ git push -f myfork featureA

这会将您的历史记录重写为现在看起来像在 featureA 工作之后提交历史记录。 由于您重新设置了分支的基数,因此必须指定 to push 命令,以便能够将服务器上的分支替换为不是其后代的提交。另一种方法是将此新工作推送到服务器上的其他分支(可能称为 )。-ffeatureAfeatureAv2

让我们再看一个可能的场景:维护者已经看过你第二个分支中的工作,并且喜欢这个概念,但希望你改变一个实现细节。您还将借此机会将工作移动到基于工程的当前分支。您基于当前分支启动一个新分支,压缩那里的更改,解决任何冲突,进行更改,然后将其作为新分支推送:masterorigin/masterfeatureB

$ git checkout -b featureBv2 origin/master
$ git merge --squash featureB
  ... change implementation ...
$ git commit
$ git push myfork featureBv2

该选项将合并分支上的所有工作并将它们压缩到一个变更集中,生成存储库状态,就好像发生了真正的合并一样,而无需实际进行合并提交。这意味着您未来的提交将只有一个父级,并允许您从另一个分支引入所有更改,然后在记录新提交之前进行更多更改。此外,该选项对于在默认合并过程中延迟合并提交也很有用。–squash–no-commit

此时,您可以通知维护者您已经进行了请求的更改,并且他们可以在您的分支中找到这些更改。featureBv2

通过电子邮件公开项目

许多项目已经建立了接受补丁的程序 - 您需要检查每个项目的特定规则,因为它们会有所不同。由于有几个较旧的,较大的项目通过开发人员邮件列表接受补丁,因此我们现在将介绍一个示例。

该工作流程与前面的用例类似 — 您可以为处理的每个补丁系列创建主题分支。不同之处在于您如何将它们提交到项目中。您不必分叉项目并推送到您自己的可写版本,而是生成每个提交系列的电子邮件版本,并通过电子邮件将它们发送到开发人员邮件列表:

$ git checkout -b topicA
  ... work ...
$ git commit
  ... work ...
$ git commit

现在,您有两个要发送到邮件列表的提交。您用于生成可以通过电子邮件发送到列表的 mbox 格式的文件 — 它将每个提交转换为一封电子邮件,其中提交消息的第一行作为主题,消息的其余部分加上提交引入的修补程序作为正文。这样做的好处是,从生成的电子邮件中应用补丁可以正确保存所有提交信息。git format-patchformat-patch

$ git format-patch -M origin/master
0001-add-limit-to-log-function.patch
0002-increase-log-output-to-30-from-25.patch

该命令将打印出它创建的修补程序文件的名称。开关告诉 Git 查找重命名。文件最终如下所示:format-patch-M

$ cat 0001-add-limit-to-log-function.patch
From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001
From: Jessica Smith <xq.com>
Date: Sun, 6 Apr 2021 10:17:23 -0700
Subject: [PATCH 1/2] Add limit to log function

Limit log functionality to the first 20

---
 lib/simplegit.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 76f47bc..f9815f1 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -14,7 +14,7 @@ class SimpleGit
   end

   def log(treeish = 'master')
-    command("git log #{treeish}")
+    command("git log -n 20 #{treeish}")
   end

   def ls_tree(treeish = 'master')
--

2.1.0 您还可以编辑这些修补程序文件,以添加您不希望在提交消息中显示的电子邮件列表的详细信息。如果在修补程序的行和开头(行)之间添加文本,开发人员可以读取它,但修补过程会忽略该内容。—diff --git

要通过电子邮件将其发送到邮件列表,您可以将文件粘贴到电子邮件程序中,也可以通过命令行程序发送。粘贴文本通常会导致格式问题,特别是对于不能适当保留换行符和其他空格的“更智能”客户端。幸运的是,Git 提供了一个工具来帮助你通过 IMAP 发送格式正确的补丁,这可能对你来说更容易。我们将演示如何通过Gmail发送补丁,Gmail恰好是我们最熟悉的电子邮件代理;您可以在 Git 源代码中阅读上述文件末尾的许多邮件程序的详细说明。Documentation/SubmittingPatches

首先,您需要在文件中设置 imap 部分。您可以使用一系列命令单独设置每个值,也可以手动添加它们,但最终您的配置文件应如下所示:~/.gitconfiggit config

[imap]
  folder = "[Gmail]/Drafts"
  host = imaps://imap.gmail.com
  user = xq.com
  pass = YX]8g76G_2^sFbd
  port = 993
  sslverify = false

如果 IMAP 服务器不使用 SSL,则最后两行可能不是必需的,并且主机值将代替 。设置完成后,您可以使用 将修补程序系列放在指定 IMAP 服务器的“草稿”文件夹中:imap://imaps://git imap-send

$ cat *.patch |git imap-send
Resolving imap.gmail.com... ok
Connecting to [74.125.142.109]:993... ok
Logging in...
sending 2 messages
100% (2/2) done

此时,您应该能够转到“草稿”文件夹,将“收件人”字段更改为您要向其发送补丁的邮件列表,可能抄送维护者或负责该部分的人员,然后将其发送出去。

您还可以通过 SMTP 服务器发送修补程序。与以前一样,您可以使用一系列命令单独设置每个值,也可以在文件的 sendemail 部分中手动添加它们:git config~/.gitconfig

[sendemail]
  smtpencryption = tls
  smtpserver = smtp.gmail.com
  smtpuser = xq.com
  smtpserverport = 587

完成此操作后,您可以使用 来发送补丁:git send-email

$ git send-email *.patch
0001-add-limit-to-log-function.patch
0002-increase-log-output-to-30-from-25.patch
Who should the emails appear to be from? [Jessica Smith <xq.com>]
Emails will be sent from: Jessica Smith <xq.com>
Who should the emails be sent to? xq.com
Message-ID to be used as In-Reply-To for the first email? y

然后,Git 会为您发送的每个补丁吐出一堆日志信息,如下所示:

(mbox) Adding cc: Jessica Smith <xq.com> from
  \line 'From: Jessica Smith <xq.com>'
OK. Log says:
Sendmail: /usr/sbin/sendmail -i xq.com
From: Jessica Smith <xq.com>
To: xq.com
Subject: [PATCH 1/2] Add limit to log function
Date: Sat, 30 May 2009 13:29:15 -0700
Message-Id: xq.com>
X-Mailer: git-send-email 1.6.2.rc1.20.g8c5b.dirty
In-Reply-To: <y>
References: <y>

Result: OK

总结

在本节中,我们介绍了多个工作流,并讨论了作为封闭源代码项目小团队的一部分与为大型公共项目做出贡献之间的差异。您知道在提交之前检查空格错误,并且可以编写出色的提交消息。您学习了如何格式化补丁,以及如何通过电子邮件将其发送到开发人员邮件列表。在不同工作流的上下文中也介绍了合并的处理。您现在已经做好了在任何项目上进行协作的准备。

接下来,您将看到如何解决硬币的另一面:维护Git项目。您将学习如何成为一个仁慈的独裁者或整合经理。

标签: da4y变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台