识别来自 git 存储库的参数更改
recognize parameter change from git repository
我想通过 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 不会 "know" 关于您在源代码管理下的文件中可能使用或未使用的语言的任何信息。一切都只是与其他内容不同或没有不同的内容。
由于方法签名可以以多种方式跨行拆分,因此甚至不能保证仅仅因为方法签名更改了名称就会出现在 diff 中的任何位置。您真正需要做的是执行某种 "structural diff"。也就是说,您必须
- 检查 "old" 版本,并将其传递给 java 解析器
- 检查 "new" 版本,并将其传递给 java 解析器
- 比较生成的解析树,寻找属于同一对象但已更改的方法
即使那样也不是很容易,因为可以重命名方法,并且因为方法重载可能会导致不清楚哪个签名更改与哪个版本的方法有关。
从那里你得到的是一个非常重要的编码问题,这超出了 SO 的范围。如果您决定解决这个问题并 运行 解决 具体 编程问题,当然您可以 post 这些问题,也许有人能够提供帮助.
我想通过 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 不会 "know" 关于您在源代码管理下的文件中可能使用或未使用的语言的任何信息。一切都只是与其他内容不同或没有不同的内容。
由于方法签名可以以多种方式跨行拆分,因此甚至不能保证仅仅因为方法签名更改了名称就会出现在 diff 中的任何位置。您真正需要做的是执行某种 "structural diff"。也就是说,您必须
- 检查 "old" 版本,并将其传递给 java 解析器
- 检查 "new" 版本,并将其传递给 java 解析器
- 比较生成的解析树,寻找属于同一对象但已更改的方法
即使那样也不是很容易,因为可以重命名方法,并且因为方法重载可能会导致不清楚哪个签名更改与哪个版本的方法有关。
从那里你得到的是一个非常重要的编码问题,这超出了 SO 的范围。如果您决定解决这个问题并 运行 解决 具体 编程问题,当然您可以 post 这些问题,也许有人能够提供帮助.