gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:34:53 25 4
gpt4 key购买 nike

我想通过 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());

导出量确实很大,无法提取方法更改。

最佳答案

您展示了一种检查差异的方法,但说输出太大并且您无法提取方法签名更改。如果你的意思是你正在询问特定的 git 支持来告诉你方法签名发生了变化,那么不 - 不存在这样的支持。这是因为 git 并不“了解”您在源代码管理下的文件中可能使用或未使用的语言的任何信息。一切都只是与其他内容不同或不同的内容。

由于方法签名可以通过多种方式跨行分割,因此甚至不能保证仅仅因为方法签名更改其名称就会出现在差异中的任何位置。您真正需要做的是执行某种“结构差异”。也就是说,您必须

  • 查看“旧”版本,并将其传递给 java 解析器
  • 查看"new"版本,并将其传递给 java 解析器
  • 比较生成的解析树,查找属于同一对象但已更改的方法

即使这也不是很容易,因为方法可能会被重命名,并且方法重载可能会让人不清楚哪个签名更改与哪个版本的方法相关。

从那里你遇到的是一个不平凡的编码问题,这超出了 SO 的范围来回答。如果您决定解决这个问题并在此过程中遇到特定编程问题,当然您可以发布这些问题,也许有人能够提供帮助。

关于java - 识别 git 存储库中的参数更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53360248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com