代码行不受最近提交的影响

时间:2016-05-09 14:57:54

标签: git diff

如何在git存储库中找到自指定日期以来更改的代码? 我正在尝试在活动开发中的分支上报告统计信息(文件/类/行数),对几周内保持不变的代码感兴趣。是否有任何git命令/工具可以帮助解决这个问题?

1 个答案:

答案 0 :(得分:2)

“开箱即用”并没有内置完全,但除了“class”位之外,构建并不是特别困难。最难的部分是确切地决定你的意思:即使你认真思考这个工具你想要什么,你也可能得到很多毫无意义的统计数据。

首先,您需要选择最新版本,而不是“自”日期,这通常是git rev-list的任务(又名git log)及其--min-age--max-age选项(也称为--until--since)。

使用这些,加上需要的任何其他选项(可能--first-parent,取决于它们周围的合并和期望的行为,以及其他排序选项,如--author-date-order,以及补偿客户端上的坏时钟所需的任何内容 - 你的git相信“他们”,无论他们是谁,当他们今天发送给你一个1975年或2031年的新提交时,这可能会扭曲你的统计数据)。确定您想要的行为,然后调整选项以获得它。

在任何情况下,结果都是某个顺序的修订ID列表(顺序取决于您给出的排序选项;默认为“提交者时间戳的反向时间顺序”)。

选择最新的一个,可能使用-n 1-1(同样的事情)。现在你有了一个起点:“有什么和没有改变”等式的一端。另一端只是分支的一端,即git rev-parse <branchname>所说的,尽管不需要从名称转换为原始提交ID,特别是如果你只是将该分支检出。

此时,最直接的工具可能是git blame(必须在每个感兴趣的文件上运行)。请注意,它内置了一些(但不是全部)内置的内容:特别是,它可以直接与--since一起使用,它实际上告诉它“使用HEAD中的所有内容,但不是之前,--since日期“。它的输出格式应该相当明显。它不会报告从它检查的最基本版本中删除的行,但这些行显然是“已更改”;当然,它不知道如何计算任何构成“类”的东西(这将取决于您选择的语言:例如,C ++和Python将需要非常不同的处理)。

要发现已删除的行和已删除的文件,有助于获得原始修订的原始ID:然后您可以使用git diff --stat <original> <latest>并解析其输出(但beware of truncation)。