当前位置: 首页 > 知识库问答 >
问题:

如何使用JGit执行“git show sha1: file”

况浩邈
2023-03-14

我使用 JGit 将本地磁盘上的存储库克隆为裸露。现在,我需要在任何给定的提交ID(SHA1)下读取文件的内容。我该怎么做?

共有2个答案

贺元明
2023-03-14

通过使用这个<代码>可迭代

孙博艺
2023-03-14

Rüdiger Herrmann在这个答案中的评论包含了相关的提示;但是为了让副本的朋友更容易

@Test
public void test() throws IOException, GitAPIException
{
    //
    // init the git repository in a temporary directory
    //
    File repoDir = Files.createTempDirectory("jgit-test").toFile();
    Git git = Git.init().setDirectory(repoDir).call();

    //
    // add file with simple text content
    //
    String testFileName = "testFile.txt";
    File testFile = new File(repoDir, testFileName);
    writeContent(testFile, "initial content");

    git.add().addFilepattern(testFileName).call();
    RevCommit firstCommit = git.commit().setMessage("initial commit").call();

    //
    // given the "firstCommit": use its "tree" and 
    // localize the test file by its name with the help of a tree parser
    //
    Repository repository = git.getRepository();
    try (ObjectReader reader = repository.newObjectReader())
    {
        CanonicalTreeParser treeParser = new CanonicalTreeParser(null, reader, firstCommit.getTree());
        boolean haveFile = treeParser.findFile(testFileName);
        assertTrue("test file in commit", haveFile);
        assertEquals(testFileName, treeParser.getEntryPathString());
        ObjectId objectForInitialVersionOfFile = treeParser.getEntryObjectId();

        // now we have the object id of the file in the commit:
        // open and read it from the reader
        ObjectLoader oLoader = reader.open(objectForInitialVersionOfFile);
        ByteArrayOutputStream contentToBytes = new ByteArrayOutputStream();
        oLoader.copyTo(contentToBytes);
        assertEquals("initial content", new String(contentToBytes.toByteArray(), "utf-8"));
    }

    git.close();
}

// simple helper to keep the main code shorter
private void writeContent(File testFile, String content) throws IOException
{
    try (OutputStreamWriter wr = new OutputStreamWriter(new FileOutputStream(testFile), Charset.forName("utf-8")))
    {
        wr.append(content);
    }
}

编辑添加:另一个可能更好的例子是在https://github . com/centic 9/jgit-cookbook/blob/master/src/main/Java/org/dstadler/jgit/API/readfilefromcomit . Java

 类似资料:
  • 我想使用jGit找到特定行的提交历史。这可以在CLI中使用git log -L来完成,如何在jGit中做到这一点?

  • 我正在使用JGit的Class Repository用java编写我的程序。 此类具有方法解析(String recstr)。 基本上,这个方法解析git修订字符串并返回一个对象id。支持这些运算符的特定组合:< br > SHA-1:完整或简略的SHA-1参考文献/...:完整的引用名称< br >短名称:refs/heads、refs/tags或refs/remotes命名空间下的短引用名称<

  • 如何使用JGit获取源远程的URL? 我正在使用JGit,我想执行 那要怎么做?

  • 我从jacoco生成了一个代码覆盖率报告,它就是jacoco。执行官。但我不知道如何使用它。。。 我生成它的方式是通过命令行: 然后我得到了杰科科。执行报告。我所需要的只是百分比的数量,我只使用命令行。有没有办法将此报告转换为可读的txt文件? 谢谢大家

  • 我正在使用JGit克隆存储库,对文件进行一些更改,提交,标记它,然后将其推送到远程存储库。 我已经使用JGit编写了代码,它将克隆存储库,在文件中进行一些更改,然后提交更改,创建新标记,并推送提交和标记。 推送后,我希望远程存储库显示我的更改和新标签,但是在远程存储库中显示的是带有提交的更改,但是标签不可见。它显示“无标签”。

  • 我需要使用JGit获取与特定提交关联的分支的名称。我使用JGit获取存储库的提交SHA的完整列表,现在我需要知道它所属的分支的名称。 如果有人能让我知道我如何做到这一点,我将不胜感激。