Git FileRevision 获取多行注释 - 仅获取第一行

Git FileRevision get comment with multiple lines - gets only first line

我正在开发 Eclipse 插件。我尝试使用以下信息提取所有源代码修订(来自 git repo 或 svn 或任何其他存储库):提交 ID、日期、作者、消息。

而且我对提交消息有问题,那些有多行的消息。 TL;DR 我只从包含多行的提交消息中获取第一行。关于如何获取整个消息内容的任何想法?

下面是一个工作代码。只需将连接 SCM 的工作区中的项目名称放在第一行即可。

    IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject("testGit");
    IJavaProject javaProject = JavaCore.create(selectedProject);
    IPackageFragment[] packages = javaProject.getPackageFragments();

    for (IPackageFragment mypackage : packages) {
        if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
            for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
                IResource file = unit.getResource();
                IFileRevision[] revisions = getFileRevisions(javaProject, file);
                if (revisions != null && revisions.length > 0) {
                    for (IFileRevision revision : revisions) {
                        System.out.println(revision.getComment());
                        System.out.println("============================================");
                    }
                }
            }
        }
    }

private IFileRevision[] getFileRevisions(IJavaProject project, IResource file) {
    RepositoryProvider repositoryProvider = RepositoryProvider.getProvider(project.getProject());
    IFileRevision[] revisions = null;
    IFileHistoryProvider fileHistoryProvider = repositoryProvider.getFileHistoryProvider();
    if (fileHistoryProvider == null)
        return null;
    IFileHistory iFileHistory = fileHistoryProvider.getFileHistoryFor(file,
            FileHistoryProvider.SINGLE_LINE_OF_DESCENT, null);
    if (iFileHistory != null) {
        revisions = iFileHistory.getFileRevisions();
    }
    return revisions;
}

请注意,您需要创建新的插件项目,而不是Java 项目。然后需要添加 dependencies 然后修复丢失的导入:

 org.eclipse.jdt.core,
 org.eclipse.core.resources,
 org.eclipse.team.core,
 org.eclipse.team.ui

代码可以在任何地方运行。最简单的方法是创建 Hello World 插件并在构造函数中的某处运行代码。

主要问题是EGitclassCommitFileRevision只有returns一个短消息,见source code.

为了获得完整的评论,我 - 绝不是专家 - 相信你必须使用 JGit,特别是 RevCommit.getFullMessage(). Maybe you want to look into the JGit user guide 以获得更多信息。 SO这里也有几个关于这个话题的问题,请自行搜索。


更新:

这是从 (non-public, 但 package-local) EGit class CommitFileRevision 通过反射。我将代码放在 "Hello world" 插件的菜单操作中:

public void run(IAction action) {
    //MessageDialog.openInformation(window.getShell(), "SO_GitPlugin", "Hello, Eclipse world");
    try {
        IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject("SoccerTable");
        IJavaProject javaProject = JavaCore.create(selectedProject);
        IPackageFragment[] packages = javaProject.getPackageFragments();

        for (IPackageFragment mypackage : packages) {
            if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
                for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
                    IResource file = unit.getResource();
                    IFileRevision[] revisions = getFileRevisions(javaProject, file);
                    if (revisions != null && revisions.length > 0) {
                        for (IFileRevision revision : revisions) {
                            Method method = revision.getClass().getMethod("getRevCommit");
                            method.setAccessible(true);
                            RevCommit revCommit = (RevCommit) method.invoke(revision);
                            System.out.println(revision);
                            //System.out.println(revision.getComment());
                            System.out.println(revCommit.getFullMessage());
                            System.out.println("============================================");
                        }
                    }
                }
            }
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

孩子们,不要在家里这样做! ;-) 这只是一个 hacky 的概念证明,实际上不必 bootstrap 使用 JGit 的所有内容。顺便说一句,您必须将插件依赖项 org.eclipse.jgit 添加到您的项目中。