Java 识别git存储库中的参数更改

Java 识别git存储库中的参数更改,java,git,github,repository,Java,Git,Github,Repository,我想通过java程序从提交到git存储库中提取签名更改(确切地说是方法参数更改)。我使用了以下代码: for (Ref branch : branches) { String branchName = branch.getName(); for (RevCommit commit : commits) { boolean foundInThisBranch = false; RevC

我想通过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;
                            }
                        }
                    }
                } 
for(参考分支:分支){
字符串branchName=branch.getName();
for(RevCommit:commit){
boolean foundInThisBranch=false;
RevCommit targetCommit=walk.parseCommit(repo.resolve(
commit.getName());
对于(Map.Entry e:repo.getAllRefs().entrySet()){
if(e.getKey().startsWith(Constants.R_HEADS)){
if(walk.isMergedInto)(targetCommit,walk.parseCommit(
e、 getValue().getObjectId()){
字符串foundInBranch=e.getValue().getName();
if(分支名称等于(foundInBranch)){
foundInThisBranch=true;
打破
}
}
}
} 
我可以从中提取提交消息、提交数据和作者姓名,但是,我无法从中提取参数更改。我的意思是,我无法识别参数更改。我想知道是否有任何方法可以识别。我的意思是,无法从程序员生成的提交注释中识别它们;我很抱歉寻找类似于任何特定注释或其他的东西。 这是我提取差异的代码:

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());
CanonicalTreeParser oldtreeeiter=new CanonicalTreeParser();
重置(读卡器,旧ID);
CanonicalTreeParser newtreiter=新CanonicalTreeParser();
重置(读卡器,磁头ID);
列表差异=git.diff()
.setNewTree(newtreiter)
.setOldTree(oldTreeIter)
.call();
ByteArrayOutputStream out=新建ByteArrayOutputStream();
DiffFormatter df=新的DiffFormatter(输出);
setRepository(git.getRepository());

导出非常巨大,无法提取方法更改。

您展示了一种检查差异的方法,但是说输出太大,无法提取方法签名更改。如果您的意思是,您询问git是否支持特定的方法签名更改,那么否-否存在支持。这是因为git对源代码管理下的文件中可能使用或可能未使用的语言一无所知。所有内容都只是与其他内容不同的内容

由于一个方法签名可以以多种方式跨行拆分,因此甚至不能保证仅仅因为一个方法的签名更改了它的名称就会出现在差异中的任何地方。你真正需要做的是执行一种“结构差异”。也就是说,你必须

  • 检查“旧”版本,并将其传递给java解析器
  • 检查“新”版本,并将其传递给java解析器
  • 比较生成的解析树,查找属于同一对象但已更改的方法
即使这样也不太容易,因为方法可以被重命名,而且方法重载可能会导致不清楚哪个签名更改与方法的哪个版本相关


从这里开始,您就遇到了一个非常重要的编码问题,这超出了SO的范围。如果您决定解决这个问题,并在过程中遇到了特定的编程问题,当然您可以发布这些问题,也许有人可以提供帮助。

我不清楚您所说的“签名更改”是什么意思(方法参数更改为精确).但我不懂java。也许你需要研究文件差异?也许这有帮助?你如何使用java访问Git存储库?你需要解析文件差异。这并不容易-行可以断开,更改可以在多行签名的一行上进行,等等。好的luck@ErwinBolwidt我使用了上面的代码来提取diff,howev呃,出口真的很大,不可能提取出方法的变化,有人知道吗??