我想通过Java程序从对git仓库的提交中提取签名更改(准确地说是方法参数更改)。我使用了以下代码:
for (Ref branch : branches) {
String branchName = branch.getName();
for (RevCommit commit : commits) {
boolean foundInThisBranch = false;
RevCommit targetCommit = walk.parseCommit(repo.resolve(
commit.getName()));
for (Map.Entry<String, Ref> e : repo.getAllRefs().entrySet()) {
if (e.getKey().startsWith(Constants.R_HEADS)) {
if (walk.isMergedInto(targetCommit, walk.parseCommit(
e.getValue().getObjectId()))) {
String foundInBranch = e.getValue().getName();
if (branchName.equals(foundInBranch)) {
foundInThisBranch = true;
break;
}
}
}
}
我可以从中提取提交消息,提交数据和作者姓名,但是,我无法从中提取参数更改。我的意思是我无法识别参数更改。我想知道是否有任何方法可以识别这一点。我的意思是不可能从程序员生成的提交说明中识别它们。我正在寻找类似任何特定注释或其他内容的东西。 这是我提取差异的代码:
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset(reader, oldId);
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset(reader, headId);
List<DiffEntry> diffs= git.diff()
.setNewTree(newTreeIter)
.setOldTree(oldTreeIter)
.call();
ByteArrayOutputStream out = new ByteArrayOutputStream();
DiffFormatter df = new DiffFormatter(out);
df.setRepository(git.getRepository());
出口真的很大,不可能提取方法更改。
答案 0 :(得分:1)
您展示了一种发现差异的方法,但是说输出太大,无法提取方法签名更改。如果那意味着您要询问特定的git支持以告诉您方法签名已更改,则否-不存在这种支持。这是因为git不会“知道”您在源代码控制下的文件中可能使用或可能未使用的语言。一切都是与其他内容相同或不同的内容。
由于方法签名可以以多种方式分割成几行,因此甚至不能保证仅因为方法签名更改了名称而会出现在diff中的任何位置。您真正要做的是执行某种“结构差异”。也就是说,您必须
即使那样也不是一件容易的事,因为可以重命名方法,并且由于方法重载可能使不清楚哪个版本的方法带有哪个签名更改。
从那里开始,您将遇到一个非平凡的编码问题,这超出了SO的范围。如果您决定解决此问题并在一路上遇到特定的编程问题,那么您当然可以提出这些问题,也许有人可以提供帮助。