使用jQAssistant Git插件查询指定作者修改的文件时结果冗余,如何排除合并提交?
jQAssistant Git插件查询指定作者修改的文件时结果冗余,如何排除合并提交?
我完全懂你现在的困扰——用Neo4j查询拉指定作者修改的文件时,结果里混了一堆你根本没碰过的文件,这大概率是合并提交在搞鬼!毕竟Git的合并提交会把所有父提交的变更都带进来,但这些文件其实并不是你修改的,就像你用git log --no-merges能得到精准结果一样,我们只需要给Neo4j查询加上过滤合并提交的条件就行。
问题根源
你的原始查询没有排除合并提交,而jQAssistant在导入Git数据时,会给合并提交的Git:Commit节点加上一个merge属性(布尔值),合并提交的这个属性值是true。这些合并提交会关联到大量不属于你修改的文件,自然就导致结果冗余了。
修改后的查询
只需要在WHERE条件里加上排除合并提交的判断,同时加上DISTINCT来对文件路径去重(对应Git命令里的sort -u):
MATCH (author:Git:Author)-[:COMMITTED]->(commit:Git:Commit)-[cc:CONTAINS_CHANGE]->(change:Git:Change)-->(file:Git:File) WHERE author.email="developer-of-interest@email-address.com" AND commit.merge = false // 过滤掉合并提交 RETURN DISTINCT file.relativePath ORDER BY file.relativePath ASC
额外验证(可选)
如果你想确认是不是合并提交导致的问题,可以先查询该作者的所有合并提交,看看对应的提交信息:
MATCH (author:Git:Author)-[:COMMITTED]->(commit:Git:Commit) WHERE author.email="developer-of-interest@email-address.com" AND commit.merge = true RETURN commit.hash, commit.message
你会发现这些合并提交就是那些带进来多余文件的“元凶”。
逻辑对齐说明
这个修改后的查询和你用的Git命令逻辑完全匹配:
commit.merge = false对应--no-merges,排除合并提交DISTINCT对应sort -u,返回唯一的文件路径列表
这样就能得到和Git命令结果一致的精准文件列表啦!
备注:内容来源于stack exchange,提问作者wemu
相关产品推荐
相关产品推荐

