在小组协作的软件开发中,作为开发人员最常见的日常操作之一,代码提交是遵循“原子质代码提交”的最佳实践。复合提交“在实际的开源和工业项目中,开发人员通常会在一段时间内更改所有代码更改。无关的变更意图或与多个开发和维护任务相对应。本文将介绍辅助工具SmartCommit的代码[1]。主要功能是通过更改分解算法的混合来提交程序,以接受开发人员的反馈和交互式调整。jiaxian的提交原子。
代码更改提交是GIT代表的版本管理系统的基本功能,它也是开发人员最常见的日常操作之一。在软件开发和团队参与的维护中,各个开发人员已从不同的目的更改以更改代码和通过GIT通过代码提交(提交)记录。代码提交是版本管理系统其他功能的基础。按时间顺序顺序的提交顺序构成了代码仓库(提交历史)的历史。此外,清晰的代码提交历史上的提交在诸如代码审查,团队协作,分支机构管理,连续集成,持续集成,诸如诸如诸如活动中起着重要作用。问题定位和维修。
如何正确使用代码提交记录,组织和个人贡献是小组开发和维护软件的有效合作的基础。“提交任务的原子代码”是GIT官方文档中提倡的最佳实践,IT是官方文档中的最佳实践这也是一种规格和要求,由开源社区(例如Angular,Vue等)和著名的软件公司(例如Google,Microsoft等)明确提倡。
“原子质代码提交”的具体含义是:每个提交中的代码更改应高度收集和包含(包含),重点是软件开发或维护任务(例如添加新功能,修复错误,重型,重型,重型重建等。MSR)研究人员,以任务为导向的提交有助于减少数据中的噪音,从而提供更清晰的历史数据。
GIT文档中提交原子的代码的描述[2]
在Google工程实践中更改提交者的要求[3]
在角度项目中提交的信息的规范[4]
在小组合作的软件开发中,“原子委员会”在开发人员小组的有效合作中起着重要作用;但是,许多研究发现,开源项目和工业项目中的“综合”通常存在)现象(约占共同提交总数的10?40%)。
与原子相反,复合提交是指一段时间内的所有代码更改的一个时间提交,即使将其与代码修改代码进行多个开发/维护任务的修改,复合提交的原因包括三个方面:三个方面:
1.在日常开发中,开发人员经常有意识地或无意识地执行多个任务,例如重建代码结构(即浮动流量流量),或在优化函数时修复错误或代码SMLL。
2.尽管某些团队或开源社区为开发人员提供了代码贡献规格,但它很少涉及有关提交方式的明确法规或指导。
3.尽管某些版本的控制系统或工具提供了选择和组织细化的代码更改(例如Git Interactive ertecanging,gitkraken/fork等)的功能,但基本上是依靠主动触发器和手动选择开发人员需要高级认知并使用成本。
典型的原子提交(左)与化合物提交(右)的比较(右)
为了应对复合提交的问题,学术界提出了各种方法和技术来分解混合机构的变化,例如基于灵感方法[5]的方法[5],《编程技术方法》 [6],基于数据流量和控制流依赖性,方法[7],基于模式匹配的方法[8]。但是,这些方法具有以下通用性限制和缺陷:
提交以任务为导向的原子,高端和自我含有原子的原子很广泛,但由于多任务平行,缺乏统一规范和工具支持不足,这种最佳实践的复合现象仍然发生尽管在现有研究中对此问题有许多研究,但其限制和缺陷使现有方法很难真正应用于工作流的实际代码提交。
为了克服现有方法的限制和缺陷,本文将介绍SmartCommit。基于图形的交互式代码更改分解算法是在开发阶段逐步指导和协助开发人员进行开发和维护任务,以执行ATOMCODE提交,以避免从根本原因提交复合。
首先,SmartCommit将混合混合和分解问题的问题转化为逐步的解决方案优化问题:
给定一个更改集?= {c1,c2,c3,...,cn}作为输入,更改分解问题的目的是分割???],每个集合称为变更组,与开发或维护任务相对应。
如下图所示,如果将所有细粒径变化作为提交作为初始状态提交,并且每个细粒度代码都以极端状态提交给独立委员会,则其目的是找到可接受的目的符合代码以在初始状态和极端状态之间提交原子的状态。
但是,由于实际情况的复杂性和代码提交的灵活性,很难通过算法完成分解过程。因此,SmartCommit将变化的分解过程视为人机 - 机器 - 机器人交互的逐步优化过程:最初的分解建议是由算法提供的,然后提供两个调整(软卷调整)和细粒径调整。在交互式机制中,辅助开发人员迅速形成了预期的变化组提交计划。算法可以使用该算法使用该算法。计算机的程序分析能力和精细的定量评估算法。生成的分解方案可以为开发人员提供更好的起点;交互式机制可以使用开发人员反馈的反馈和调整算法生成解决方案的反馈和调整来指导算法生成特工生成的分解方案,以更接近预期的状态。考虑代码提交本身是人类计算机的过程交互(开发人员需要添加更改,描述更改,相关问题等),SmartCommitAdaDages的变化和分解机制以及开发人员的信息优势共同完成混合混合和分解任务。
互动分解过程的卓越混合变化过程
上述想法被实现为SmartCommit算法。下图是其工作流程,主要包括以下四个阶段:
1.更改收集处理
给定GIT工作区域或化合物提交,请在其中提取代码更改,然后使用代码更改块(di Qu huink)。
2.图形施工(图构造)
根据代码更改关系图,更改中涉及的节点由代码更改汇总,每个代码都会更改为一个点。代码更改关系图(di q bhuank graph);
3.更改互动分解
通过类别的类别分类算法,将关系图的代码的点集分为几个独立的子集,每个子集都转换为变更组。相互作用调整;
4.更改一个单击提交(提交提交)
当分解方案达到提交状态时,开发人员可以选择要提交的几个更改,附加描述组中代码更改的信息,然后一次点击向版本控制系统提交多个更改。
SmartCommit算法流程概述
由于空间的限制,以下将主要关注SmartCommit算法的三个核心部分:
1.数据结构:使用项目不同位置的建模分布之间的代码更改关系之间的关联结构。
2.分解算法:基于分类算法和核心生成代码更改分解解决方案的算法
3.交互式机制:通过交互机制的交互机制和开发人员背景知识的交互作用机制综合算法分析功能
为了修改代码更改与精细的代码之间的关系,我们采用了图形(图)的数据结构并设计了“变更关系图”。代码更改关系映射的点集由变化huck和每个更换的块对应于工作区域或提交中的独立代码编辑/修改;从维度,从维度连接的两个变化块之间的连接及其强度之间的连接。
对于点集,SmartCommit通过分析输入工作区或某个复合材料来提交它,并根据GIT DIFF结果(基于文本)和代码摘要语法(AST)绘制更多信息。必要的信息包括:
1.索引:它由file_index:hunk_index组成,唯一在源代码中更改更改块的位置。File_index表示当前更改的源文件(父文件)。浓度浓度的指数编号;hunk_index表示父文件中所有更改的索引,从0到开始编号排序;
2. Change_type:更改操作类型,例如新,删除,修改等;
3. base_hunk/current_hunk:此更改是一个编码块,对应于版本,文件路径,行号范围,代码片段,AST子树木和其他信息。
对于边缘集,SmartCommit集成了指标与相关研究与变化之间的耦合之间的耦合之间的一定相关性。
1.结构相关
指代码更改之间的直接或间接语法和语义依赖性。这些关系通常是定向的,并且在提交期间不能被破坏(例如,该方法的方法在其陈述/定义之前不能提交,否则该版本将在Middlethere中提交是汇编错误);
2.启发式相关性
可以推断,从相同的编辑操作的灵感规则中得出了多个细粒度变化。应用克隆代码的更改,具有相同定义范围的相邻更改等。
3.重构相关性
它旨在检测由同一系统或结构变更产生的多个细化的代码更改,这些更改分布在不同位置的不同位置,主要是指各种类型的重建操作;
4.逻辑相关性
它与语义语义语义语义无关,而与编辑动作的共同操作(例如代码格式的变化,死亡代码清洁和文本移动)的共同操作有关。
上述类型的关联关系对应于一种边缘类型。关联关系的强度用作边缘的正确值。有关详细信息,请参阅论文中的详细信息描述和代码实现。除了上述关系外,代码更改关系可以轻松扩展其他维度的相关关系,例如进化耦合,时间戳记,时间差异等。但是,为了获得此信息,该算法需要依靠特定类型的版本管理工具(VC)或集成开发环境(IDE)来实现代码编辑历史记录的历史记录。
在当前工作区域中获得相应的代码更改关系图后,我们将设置的分解问题转换为代码更改关系图的图形划分,即综合节点和权重之间的边缘Edge重量将代码的点集与更多图表分为一组相互排斥的子集。
借鉴多层图分配思想,SmartCommit使用基于Kruskal的分类算法。该算法使用更多代码来更改关系图和可选的权重阈值(当用户未设置阈值时,Max,则-GAP分离器算法用于动态确定临界点)。首先,该算法会创建一个空的优先级队列?它用于保存边缘和数组的组合吗?它用于保存更改组(每个顶点都将初始化为一个元素之一,每个代码被更改为一个单独的组,为一个组。将三个元组(?,?(?(?,?))添加到优先级队列中。SORT,按照起始节点遵循ID和目标节点的ID。然后,该算法进入一个周期:弹出当前队列的最优先边缘;如果当前一侧的两个端点已经在同一组中,则忽略边缘并且循环继续;否则,如果其重量大于阈值,则将合并两个端点所在的数据包。如果边缘的重量小于阈值,还是?或空的,循环被终止,并因此生成连接集;如果仍然存在一组节点,则将这些节点合并为一个组,并将其添加到其他组中。内容限制,所有节点数据包都是代码更改关系的划分的结果。
基于Kruskal和Max-Gap分离器算法的分区过程
基于计划算法获得的节点数据包,它将转换为代码更改组,作为算法提出的组解决方案,它为开发人员提供了以适当形式检查的开发人员。期望,开发人员可以通过两个交互操作进行调整:
通过控制算法以生成不同的粒度分解方案来重组分解算法。在SmartCommit的实际实现中,代码更改的关系图将被缓存到内存或硬盘。因此,重新运行该算法不需要重新构建图,并且生成速度更快。粗粒度控制的目的是使用开发人员对算法生成计划的反馈的反馈,指导算法,以关闭算法,以关闭算法。对预期的组状态迅速,并生成不需要或仅需要少量细化的调整的解决方案。
通过在不同的数据包之间更改单个或多个代码,对分布错误的少量更改移至应该属于的数据包。细粒径调整的目的是使开发人员可以罚款 - 提交的精细细化的罚款,以修改算法的结果或排除不需要提交的更改。
在获得可接受的分解解决方案之后,开发人员可以选择一个或单击公式的部分或所有单击公式来生成多个提交,并将所选变更组记录到版本管理系统中的一系列连续提交中。
需要声明的是,由于需要考虑不同项目之间的通用性,因此SmartCommit的默认数据包粒径是广义上的开发和维护任务(例如实施新功能,修复问题,重建等)。,而不是特定的细粒度变化。(例如添加类,更改方法参数,修改返回值类型等)。SmartCommit遵循开发和维护任务的分类[9](自动化版本发布工具)和提交[10](指定提交消息的工具),因此可以与这些工具一起使用。
提交提交类型分类规则
为了避免从根系中出现复合提交的出现,SmartCommit着重于指导和辅助开发人员考虑在开发阶段期间代码变化的原子质。与先前的工作不同,SmartCommit从基于多个维度的多个维度上更改。面对广义维护和开发任务,变化的变化发生了变化,人类计算机的交互机制结合了算法和开发人员的各自优势
SmartCommit的核心算法使用Java进行实现[11],该算法配备了基于Nodejs和Electron的GUI界面[12]。借助Java和Electron的横平功能,该工具支持三个操作系统:Windows,Linux,Linux,Linux,Linux和macos;当代码提交时,它可以用作独立的桌面软件或Intellij Idea插件-in.cal。通过GIT命令行。
作为2019 - 2020年华为探索大学的技术合作项目,SmartCommit已于2020年初作为Intellj Idea插件登陆。华为云,消费者云,欧拉,云核心网络和其他团队使用它来使用每日代码进行每日代码。作为提交类型分类,提交信息自动生成以及相关问题的建议(问题ID)。
同时,研究人员在开源项目和工业环境中对SmartCommit进行了实验评估,并通过比较跨验证算法和工具的效果,通过比较实验结果进行了实验。- 已知的开源项目以及华为内部工程师中83位工程师的36周分析。结果表明:
1.准确率:SmartCommit生成的初始分解计划可以达到10个开源项目的准确性(中位数)的71.00%-83.50%。(中位数)。
2.互动性:在没有用户参与的情况下,仅通过细粒度调整才需要步骤(1-15个操作);在80%中不超过5个步骤。
3.跑步性能:在90%的情况下,可以在5秒内分析SmartCommit,并且随着输入规模的增加,操作时间不会显着增加。
4.实践价值:受访的10位活跃用户表示,SmartCommit可以有效地帮助开发人员遵循最佳实践并带来其他好处。例如,分组之后的变更组更有可能编写提交消息。分组后,更容易找到不应提交的更改(例如本地配置,个人信息,敏感数据)等。
为了响应复杂的代码提交问题,本文介绍了基于静态程序分析和分类算法的代码更改辅助分解和提交工具smartCommit。该工具可以自动分析细粒度变化之间的关系,并自动分解混合混合混合或混合混合混合物或非原子提交;借助GUI前端界面,它可以互动并逐步协助开发人员遵循这项最佳实践的任务。SmartCommit在开源和工业项目中进行了实验验证,结果表明,其自动分解算法为开发人员提供了启动的开发人员改善代码提交原子的观点,并降低了开发人员的成本,以通过交互式机制遵循最佳实践。
作为由研究结果构建的工具原型,SmartCommit在实际使用中还具有一些限制和缺陷,例如::::
1.当前的实施仅支持GIT项目和Java语言代码。
2.该算法并未充分利用所有维度的变化,并且有空间可以进一步提高自动分解的准确性。
3.工具当前面临开发和提交阶段,该阶段可以替换诸如git diff/add/commit/push之类的命令。它可以应用于代码审核阶段吗?
为了满足上述需求,SmartCommit的效果得到了进一步的改进,并扩大了可用范围。我们目前正在开发2.0版的SmartCommit,以通过重建来实现以下改进:
1.图形结构:提取并确定语言的图表构造部分,并使用通用代码分析仪替换当前在Java中使用的JDT解析器来支持更多语言。
2.在图分解方面:使用矩阵表格存储多个图表,增加更大维度变化之间的相关信息,并结合向下和下方 - 顶点群集算法的划分,以进一步引入数据驱动的方法以改进自动自动方式分解算法的精度。
3.交互和应用程序:收集用户在交互过程中生成的反馈数据并使用它;增加适合处理核心算法的拉动请求的API,并集成生成算法的更改描述。
软件工程基础(FSE)基础的工程会议和研讨会,pp。379-390。2021。
[2] https://git-scm.com/docs/gitworkflows#_sepalaate_changes
[3] https://google.github.io/eng-practices/
[4] https://github.com/angular/angular/blob/master/contributing.md
[5] K. Herzig和A. Zeller。
然后,然后
然后,然后
[9] https://github.com/semantic-release/semantic-release
[10] https://github.com/commitizen/conventional-commit-类型
[11] https://github.com/symbolk/smartcommitcore
[12] https://github.com/symbolk/smartcommit
本文分享了华为的真诚云社区,作者:敏捷小米。