自建diff平台是基于git的(其他的都差不多。先了解一下diff平台是干什么用的,无非就是下面关键的应用发布卡点触发代码。在发布过程中如何存储评论、消息和提交记录crdiffprocessfasterandlighter获取diff后如何将diff呈现给前端,点击diff文件与“who”对比,如何对比呈现对以上问题一一分析细化考虑当你想要触发这个diff,唯一可以确定的就是release过程中的pre-releasestuckpoint,也就是说下一步发布图TDA[buildandpackage]-->|stuck必须通过代码cr通过后Point|B(codereview)-->|Pass|C(release)另一种情况是在日常开发过程中是否要经过release流程(比如技术优化等),比如一个分支,需要单独给团队成员或者同事发送diffreview,所以综上所述,需要有一个可以触发diff的功能。其实就是把需要diff的分仓库记录到数据库中,返回对应的id拼接成一个diff地址。类似:http://diff.com/diffId?=111那么剩下的工作就交给下一步(初始化diff)。第二步是存储和记录diff过程中的评论、消息和提交记录。这一步实际上是在考虑如何设计数据库表,存储信息其实很简单,无非就是1git地址(用来初始化仓库比较diff)2注释内容3发起diff的人信息4这个分支的commmitlist(为什么要记录这个,因为每次都可以从这里查看分支提交内容并进行diff)第三,如何更快更轻量级的实现branchdiff是重点。涉及到内核如何初始化diff给前端。首先,细化这一步需要做的工作。获取步骤1中的diff链接。(相关的git信息和数据库信息已经初始化),从diffId获取的初始化信息有两个:1branch(需要diff的分支号)2git仓库地址根据git仓库,执行如下shell:(这个不用赘述,有一点node基础的应该知道在nodejs中如何执行shell操作)`mkdir-p${initCodeAddressDiff}&&cd${initCodeAddressDiff}&&gitinit&&git远程eaddorigin${gitAddress}&&gitfetch`其中initCodeAddressDiff为本应用在服务器上建立的分支文件目录。比如应用叫test,分支是0.0.1,那么目录就是test/0.0.1,然后在这个目录下,初始化git仓库(gitAddress)。上一步完成后,gitshell可以操作的文件容器就实现了。接下来就是获取这个分支的diff信息(注意:这个过程中省略了很多空判断和容错修正。test,后面的shell都是在这个文件目录下执行的):`gitfetch&&gitmerge-baseremotes/origin/masterremotes/origin/${branch}`这一步是做什么的?就是在拉出分支时获取master祖先分支节点的commit。后续与该节点进行比较,同时将commitId存入数据库,后续直接用于获取该分支所有未合并的commitList`gitlogremotes/origin/master..remotes/origin/${branchTag}--pretty=format:"%H^%an^%cn^%s^%cd"`这就是我上面说的每次提交的比较都是从真正获取diff开始`gitfetch&&gitdiff${masterCommitId}${branchTag}--stat-name-width=800--stat-width=1000`这一段是获取diff的内容,但是我还是要知道改了多少,加了哪些类型,删除和修改?例如:index.jsx--------+23,-2,M(这个文件是改M,增加23行,删除2行)所以需要执行如下命令:`gitfetch&&gitdiff${masterCommitId}${branchTag}--name-status`最终组合后,将diff文件渲染成树状结构返回给前端。这个时候diff的内容就准备好了。4.获取diff后如何将diff呈现给前端。Steps最后一步三中的组合信息返回给前端点击diff文件后,需要看与祖师傅对比的变化。如何实现这一步?首先比如点击上一步提到的index.jsx文件,那么需要输出拉取时间对应的masterCommitId节点的文件内容(oldFile)和本分支0.0最新的文件内容(nowFile).1,输出到前端。执行下面的shell命令gitshow${commitId}:${filePath}是不是很简单,这样就可以得到commitId对应的filePath文件的内容5点击diff文件,与“who”进行比较,如何compare和beforepresent都是在拉分支的时候和节点的masterCommit进行比较。这样,如果主分支合并了其他分支,这些合并不会体现在你的diff中,所以你也可以使用shell合并最新的currentmasterID获取返回给前端,这样用户就可以根据实际情况选择是对比祖先分支还是当前最新master`gitlogremotes/origin/${branchTag}--pretty=format:"%H^%an^%cn^%s^%cd"-1`以下是如何比较两个文件。OldFile和nowFile其实很简单。如果时间成本允许,可以使用npmdiff自建渲染。图片方便的话,可以直接使用比较Import{MonacoDiffEditor}from'react-monaco-editor'到该类的开源库;至此,整个实现方法就讲完了。希望大家严格执行代码cr,让线上的bug少一些。说说遇到的问题等等:用nodechild_process.exec和child_process.spawn两个子进程评论一下怎么通知相应的人。如果你点了pass,这个分支有新的提交,那么你需要resetthistofail
