
当开发者每提交一笔Pull Request/Commit时,都会有代码修改量,包含新增了多少行代码、删除了多少行代码。这属于过程动态的统计方式。还可以统计仓库代码量,不关注提交过程,只关注存留的代码量。这属于静态的统计方式。每位开发者都会关注自己贡献的代码量,此文就总结下,各个代码量统计方式。
先看下git log相关的参数说明。
git log 参数说明
–numstat
Similar to --stat, but shows number of added and deleted lines in decimal notation and pathname without abbreviation, to make it more machine friendly. For binary files, outputs two
- instead of saying 0 0.–shortstat
Output only the last line of the --stat format containing total number of modified files, as well as number of added and deleted lines.
–stat
使用–stat参数主要可以在git log 的基础上输出文件增删改的统计数据。
$ git log --stat
commit fa71c098e2912b69a1c82348d403b3260f2dc64e (HEAD -> temp_temp)
Author: zz********g <z********g@gmail.com>
Date: Wed Aug 12 17:19:05 2020 +0800
add txt file and dir # commit信息
txt/a.txt | 1 + # 文件修改状态,添加或删除了多少行
1 file changed, 1 insertion(+) # 统计变更文件数量执行后获得输出如下:
commit d0411d5e8d26be3abde076e24f026b25cc2e7819 (HEAD -> master, origin/master, origin/HEAD)
Merge: ae99435 faf351b
Author: ******** <d********g@h****I.com>
Date: Tue Feb 21 12:54:28 2023 +0000
!1358 add communication_dsoftbus commiter
Merge pull request !1358 from michael4096/master
commit ae99435b2347d4b648c03f9dcf7d7e095bb150a4
Author: z********o <z********0@h****I.com>
Date: Tue Feb 21 12:42:59 2023 +0000
!1360 Add libabigail and elfutils to openharmony-sig
* Add libabigail and elfutils to openharmony-sig
2 0 sig/sig-basicsoftwareservice/sig-basicsoftwareservice.md
2 0 sig/sig-basicsoftwareservice/sig-basicsoftwareservice_cn.md
6 2 sig/sigs.json
3 files changed, 10 insertions(+), 2 deletions(-)开子进程:
process = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding=_encoding, cwd=WORKING_DIR + project_name)在检出的代码仓目录下,执行 cmd=[‘git’, ‘log’, ‘–shortstat’, ‘–numstat’],处理输出,就可以统计出来仓库每一笔提交的代码增删修改量。
使用cloc工具统计仓库代码量,cloc相关的参数如下,其中force-lang-def指定支持的编程语言定义,by-file-by-lang 指定按编程语言按文件分别输出。
--read-lang-def=E:\\WorkSpace\\lmk-bohan\\stat-data\\my_definitions.txt --by-file-by-lang参数说明
--force-lang-def=<file> Load language processing filters from <file>,
then use these filters instead of the built-in
filters. Note: languages which map to the same
file extension (for example:
MATLAB/Mathematica/Objective-C/MUMPS/Mercury;
Pascal/PHP; Lisp/OpenCL; Lisp/Julia; Perl/Prolog)
will be ignored as these require additional
processing that is not expressed in language
definition files. Use --read-lang-def to define
new language filters without replacing built-in
filters (see also --write-lang-def,
--write-lang-def-incl-dup).
--by-file-by-lang Report results for every source file encountered
in addition to reporting by language.在代码仓下,开子进程:
process = subprocess.Popen(cmd,stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding='utf-8', cwd=WORKING_DIR, errors='ignore')执行:
cmd = ['stat-data\\cloc-1.92.exe', '--read-lang-def=' + _current_file + '\\stat-data\\my_definitions.txt',
'--by-file-by-lang', name]即可以得到代码仓的每个程序的文件的代码量详情,包含blank空行、comment注释行、code代码行等,通常取其加和,都计算为代码量。输出示例内容如下:
100 files
200 files
300 files
312 text files.
classified 254 files
Duplicate file check 254 files (245 known unique)
Unique: 100 files
Unique: 200 files
251 unique files.
Counting: 100
Counting: 200
131 files ignored.
github.com/AlDanial/cloc v 1.92 T=0.24 s (1034.9 files/s, 69044.2 lines/s)
-----------------------------------------------------------------------------------------
File blank comment code
-----------------------------------------------------------------------------------------
community\sig\sigs.json 0 0 1068
community\zh\committer.md 0 0 442
community\sig\sig_list.toml 49 1 283
community\sig\README.md 46 0 190
。
。
。
community\sig\sig-linkboy\oh\oh8.md 7 0 4
community\sig\sig-linkboy\sig_linkboy.md 4 0 4
community\sig\sig-linkboy\oh\oh3.md 6 0 3
-----------------------------------------------------------------------------------------
SUM: 3684 1 13061
-----------------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Markdown 248 3635 0 11685
JSON 2 0 0 1093
TOML 1 49 1 283
-------------------------------------------------------------------------------
SUM: 251 3684 1 13061
-------------------------------------------------------------------------------在上一章节,可以统计代码仓的代码量,有时候还想知道每一个开发者在这个代码仓中贡献了多少代码量,甚至还可以根据邮箱后缀,还知道每一家单位贡献的代码量。
对于上一章节cloc统计的每一个源代码文件,可以对这些文件执行git blame命令:
cmd = ['git', 'blame', '-e', _file_path]示例输出如下,可以看出这个文件,每一行最后是谁贡献的。如果一行文件,属于A新增的,但是B修改后,那最终显示这一行属于B贡献的,最后一次修改者最终贡献了这一行代码。
git blame -e default.xml
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 1) <?xml version="1.0" encoding="UTF-8"?>
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 2) <manifest>
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 3) <remote fetch="."1 name="origin" review="https://openharmony.gitee.com/openharmony/"/>
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 4) <default remote="origin" revision="master" sync-j="4" />
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 5)
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 6) <include name="ohos/ohos.xml" />
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 7) <include name="chipsets/all.xml" />
7d700a41 (<z**************n@h****I.com> 2022-05-07 21:01:53 +0800 8) </manifest>
D:\codes\code-count\manifest>git blame -e devboard.xml
019f8d3f (<m***************1@h****I.com> 2021-04-20 15:11:42 +0800 1) <?xml version="1.0" encoding="UTF-8"?>
019f8d3f (<m***************1@h****I.com> 2021-04-20 15:11:42 +0800 2) <manifest>
9e17c922 (<m***************1@h****I.com> 2021-11-27 06:33:25 +0000 3) <remote fetch="https://gitee.com/openharmony-sig" name="sig" review="https://gitee.com/openharmony-sig/"/>
019f8d3f (<m***************1@h****I.com> 2021-04-20 15:11:42 +0800 4) <include name="default.xml" />
019f8d3f (<m***************1@h****I.com> 2021-04-20 15:11:42 +0800 5) <project name="device_st" path="device/st" revision="master" remote="sig"/>
c3deb066 (<l*************g@h****I.com> 2021-04-28 17:04:50 +0800 6) <project name="device_allwinner" path="device/allwinner" revision="master" remote="sig"/>
c3deb066 (<l*************g@h****I.com> 2021-04-28 17:04:50 +0800 7) <project name="vendor_h****I_ipcamera_v3s" path="vendor/h****I/ipcamera_v3s" revision="master" remote="sig"/>
019f8d3f (<m***************1@h****I.com> 2021-04-20 15:11:42 +0800 8) <project name="vendor_h****I_minidisplay_demo" path="vendor/h****I/minidisplay_demo" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 9) <project name="device_mediatek" path="device/mediatek" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 10) <project name="device_nordic" path="device/nordic" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 11) <project name="device_nxp" path="device/nxp" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 12) <project name="device_fudanmicro" path="device/fudanmicro" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 13) <project name="device_bestechnic" path="device/bestechnic" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 14) <project name="device_ingenic" path="device/ingenic" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 15) <project name="device_espressif" path="device/espressif" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 16) <project name="device_winnermicro" path="device/winnermicro" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 17) <project name="device_unisoc" path="device/unisoc" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 18) <project name="device_broadcom" path="device/broadcom" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 19) <project name="device_realtek" path="device/realtek" revision="master" remote="sig"/>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 20) <project name="device_bouffalolab" path="device/bouffalolab" revision="master" remote="sig"/>
019f8d3f (<m***************1@h****I.com> 2021-04-20 15:11:42 +0800 21) </manifest>
2bb5688e (<l*************g@h****I.com> 2021-06-07 10:45:13 +0800 22)本文介绍了代码量统计的各种方式。统计每一笔提交的增删改修改量,偏重统计过程中的贡献,批量增删时,容易产生巨量的代码量。cloc可以看出代码仓的最新最终规模,过程中的批量增删,会对冲。而git blame统计会看重每一位贡献者的代码量。
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源