gpt4 book ai didi

java - 与 JGit 的最后一次提交的文件差异

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:47 24 4
gpt4 key购买 nike

我正在尝试使用 JGit 获取文件从上次提交到最近未提交更改的差异。我怎样才能用 JGit 做到这一点? (使用命令行将是 git diff HEAD 的输出)

经过多次讨论(link1link2),我提供了一段代码,能够找到未提交的文件,但我无法获得文件的差异

Repository db = new FileRepository("/path/to/git");
Git git = new Git(db);

AbstractTreeIterator oldTreeParser = this.prepareTreeParser(db, Constants.HEAD);

List<DiffEntry> diff = git.diff().setOldTree(oldTreeParser).call();

for (DiffEntry entry : diff) {
System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
DiffFormatter formatter = new DiffFormatter(System.out);
formatter.setRepository(db);
formatter.format(entry);

}

更新

这个问题是很久以前的事了。我现有的 for 确实显示未提交的代码。在显示差异的上下文中,我用于 prepareTreeParser 的当前代码是:

public void gitDiff() throws Exception {
Repository db = new FileRepository("/path/to/git" + DEFAULT_GIT);
Git git = new Git(db);

ByteArrayOutputStream out = new ByteArrayOutputStream();
DiffFormatter formatter = new DiffFormatter( out );
formatter.setRepository(git.getRepository());
AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(), Constants.HEAD);
FileTreeIterator workTreeIterator = new FileTreeIterator( git.getRepository() );
List<DiffEntry> diffEntries = formatter.scan( commitTreeIterator, workTreeIterator );

for( DiffEntry entry : diffEntries ) {
System.out.println("DIFF Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
formatter.format(entry);
String diffText = out.toString("UTF-8");
System.out.println(diffText);
out.reset();
}
git.close();
db.close();

// This code is untested. It is slighting different for the code I am using in production,
// but it should be very easy to adapt it for your needs
}
private static AbstractTreeIterator prepareTreeParser(Repository repository, String ref) throws Exception {
Ref head = repository.getRef(ref);
RevWalk walk = new RevWalk(repository);
RevCommit commit = walk.parseCommit(head.getObjectId());
RevTree tree = walk.parseTree(commit.getTree().getId());

CanonicalTreeParser oldTreeParser = new CanonicalTreeParser();
ObjectReader oldReader = repository.newObjectReader();
try {
oldTreeParser.reset(oldReader, tree.getId());
} finally {
oldReader.release();
}
return oldTreeParser;
}

最佳答案

以下设置适用于我:

DiffFormatter formatter = new DiffFormatter( System.out );
formatter.setRepository( git.getRepository() );
AbstractTreeIterator commitTreeIterator = prepareTreeParser( git.getRepository(), Constants.HEAD );
FileTreeIterator workTreeIterator = new FileTreeIterator( git.getRepository() );
List<DiffEntry> diffEntries = formatter.scan( commitTreeIterator, workTreeIterator );

for( DiffEntry entry : diffEntries ) {
System.out.println( "Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId() );
formatter.format( entry );
}

未提交的更改可通过 FileTreeIterator 访问。使用 formatter.scan() 而不是 DiffCommand 的优点是可以正确设置格式化程序来处理 FileTreeIterator。否则,您将收到 MissingObjectException,因为格式化程序试图从存储库中的工作树中找到更改。

关于java - 与 JGit 的最后一次提交的文件差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486483/

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