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