java - 如何使用 JGit 获取文件更改列表?

标签 java eclipse git jgit

使用 JGit,我想获得一个提交文件中的更改列表,这可以通过 git log --full-history -p -1 <hash-id> 获得。 .

这可能吗?如果是这样,你是怎么做到的?

我知道如何获取每个提交,并查看提交消息:

//Load repo
FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repo = builder.setGitDir(new File("/path/to/repo/.git")).setMustExist(true).build();
Git git = new Git(repo);
//get commits
Iterable<RevCommit> log = git.log().call();
for (RevCommit commit : log) {
    //Shows the hashid
    System.out.println("LogCommit: " + commit);
    //Shows only commit message
    String logMessage = commit.getFullMessage();
    System.out.println("LogMessage: " + logMessage);
}
git.close();

什么允许我获取文件中的更改?

例如我写:

git log --full-history -p -1 8309c1262e1b7ffce8fc86efc1ae5777a4a96777

响应是

commit 8309c1262e1b7ffce8fc86efc1ae5777a4a96777
Author: <redacted>
Date:   Thu Aug 4 12:15:23 2016 -0400

    Fixed typo in commit

diff --git a/Product/Production/Common/CONNECTCoreLib/src/main/java/gov/hhs/fha/nhinc/messaging/server/BaseService.java b/Product/Production/Common/CONNECTCoreLib/src/main/java/gov/hhs/fha/nhinc/messaging/server/BaseService.java
index fa55e7e..4f3c155 100644
--- a/Product/Production/Common/CONNECTCoreLib/src/main/java/gov/hhs/fha/nhinc/messaging/server/BaseService.java
+++ b/Product/Production/Common/CONNECTCoreLib/src/main/java/gov/hhs/fha/nhinc/messaging/server/BaseService.java
@@ -56,6 +57,7 @@ public abstract class BaseService {

     protected AssertionType getAssertion(WebServiceContext context, AssertionType assertionIn) {
         AssertionType assertion;
-        WSAHeaderHelper wsaHlpr = new WSAHeaderHelper();
+        WSAHeaderHelper wsaHelper = new WSAHeaderHelper();
         if (assertionIn == null) {
             assertion = SAML2AssertionExtractor.getInstance().extractSamlAssertion(context);

我想要像下面这样的东西。 Change 是一个虚构的类:

//Load repo
FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repo = builder.setGitDir(new File("/path/to/repo/.git")).setMustExist(true).build();
Git git = new Git(repo);
//get commits
Iterable<RevCommit> log = git.log().call();
for (RevCommit commit : log) {
    //Shows the hashid
    System.out.println("LogCommit: " + commit);
    //Shows only commit message
    String logMessage = commit.getFullMessage();
    System.out.println("LogMessage: " + logMessage);
    List<Change> changes = commit.getChanges();
    for(Change change: changes):
        System.out.println("File: " + change.getFile());
        System.out.println("Change: " + change.getChange());
        System.out.println("ChangeType: " + change.getChangeType());
}
git.close();

输出看起来像这样:

LogCommit: 8309c1262e1b7ffce8fc86efc1ae5777a4a96777
LogMessage: Fixed typo in commit
File: Product/Production/Common/CONNECTCoreLib/src/main/java/gov/hhs/fha/nhinc/messaging/server/BaseService.java
Change: WSAHeaderHelper wsaHlpr = new WSAHeaderHelper();
ChangeType: D
File: Product/Production/Common/CONNECTCoreLib/src/main/java/gov/hhs/fha/nhinc/messaging/server/BaseService.java
Change: WSAHeaderHelper wsaHelper = new WSAHeaderHelper();
ChangeType: A

最佳答案

JGit 有一个非常简单的 diff 命令,可以将两次提交之间的更改文本差异写入输出流。

例如:

OutputStream outputStream = ...
List<DiffEntry> diffEntries = git.diff().setOutputStream(outputStream).call();

可能更有趣的是调用命令后返回的 DiffEntry 列表。 每个 DiffEntry 代表一个已更改的文件并告知其路径名称、是否添加、更改或删除、指向旧内容和新内容的指针(blob-ID)等等。

并且从每个 DiffEntry 中,您可以获得一个 EditList,其中包含有关更改了哪些行的信息。

例如:

try (DiffFormatter diffFormatter = new DiffFormatter(DisabledOutputStream.INSTANCE)) {
  diffFormatter.setRepository(git.getRepository());
  List<DiffEntry> diffEntries = diffFormatter.scan(oldTreeIterator, newTreeIterator);
  FileHeader fileHeader = diffFormatter.toFileHeader(diffEntries.get(0));
  return fileHeader.toEditList();
}

此代码还展示了如何在不使用 DiffCommand 的情况下通过更详细的控制获取 diff 条目。

就在最近,我写了一篇关于 JGit 的差异 API 的完整博客文章。有关详细信息,请参阅此处:http://www.codeaffine.com/2016/06/16/jgit-diff/

关于java - 如何使用 JGit 获取文件更改列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935160/

相关文章:

Python 强类型列表

git - 如何减少同一源的多个子模块的内存占用?

java - 霍夫曼节点和 NullPointerException

java - 在 grails Controller 中识别 ajax 请求或浏览器请求

eclipse - Java在win7上很慢

java - 通过 Eclipse 从 Java(FX) 创建 Windows EXE

java 对象相等不起作用

java - 在 JDT AST 中,如何从 MethodInvocation 节点检索 MethodDeclaration 节点?

git - 如何只将特定标签推送到远程?

Git:如何反向 merge 提交?