繁体   English   中英

使用JGit fetch()并检查更新的文件

[英]Using JGit fetch() and check for updated files

使用JGit,我签出了一个分支( branch1 )。 一段时间后,我想获取()并查看自上次获取以来已更新了哪些文件(在原始位置)。

FetchResult fetchResult = m_git.fetch().setRefSpecs(new RefSpec("refs/heads/branch1")).call();

// For example:
fetchResult.getUpdatedFiles()

我该怎么做呢?

提取API的粒度级别是提交,而不是文件。 因此,提取本身不会告诉您哪些文件已更新。

但是, FetchResult保留有关提取操作结果的详细信息。

遍历FetchResult::getTrackingRefUpdates以查看所有已更新的引用(在您的示例中应该只是一个)。 对于您感兴趣的每个更改的引用, TrackingRefUpdate描述相应引用的获取操作的结果。

首先查看result属性,以查看总体结果是否符合您的要求。 对于常规引用更新,请使用getOldObjectIdgetNewObjectIdgetNewObjectId新旧提交。

请参阅此处如何与JGit进行比较: 如何显示JGit提交之间的更改

我找到了对我有用的东西。

从jgit食谱中获得大部分信息: https : //github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/ShowFileDiff.java#start-of-content

下面的DiffEntry集合向我展示了修改后的文件。 (仅供参考,可以在合并之前完成)

fetch();

// todo: isn't there a critical section here? Only within the same repo maybe. We could prevent simultaneous use of the same racfid.
Ref fetchHead;
try {
    fetchHead = m_git.getRepository().findRef("FETCH_HEAD");

    //todo: show the diff bewteen fetch-head and the current head.
    // - get object id of fetch
    // - get oid of head

    ObjectId head = m_git.getRepository().resolve(Constants.HEAD);

    AbstractTreeIterator oldTreeParser = prepareTreeParser(m_git.getRepository(), fetchHead.getObjectId());
    AbstractTreeIterator newTreeParser = prepareTreeParser(m_git.getRepository(), head);

    List<DiffEntry> diff = m_git.diff().
        setOldTree(oldTreeParser).
        setNewTree(newTreeParser).
        // setPathFilter(PathFilter.create("README.md")).
        // to filter on Suffix use the following instead
        //setPathFilter(PathSuffixFilter.create(".java")).
        call();

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

}

private static AbstractTreeIterator prepareTreeParser(Repository repository, ObjectId objectId) throws IOException {
    // from the commit we can build the tree which allows us to construct the TreeParser
    //noinspection Duplicates
    try (RevWalk walk = new RevWalk(repository)) {
        RevCommit commit = walk.parseCommit(objectId);
        RevTree tree = walk.parseTree(commit.getTree().getId());
        CanonicalTreeParser treeParser = new CanonicalTreeParser();
        try (ObjectReader reader = repository.newObjectReader()) {
            treeParser.reset(reader, tree.getId());
        }
        walk.dispose();
        return treeParser;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM