3

我需要使用 git 管道命令(例如git book 的第 9 章中使用的那些),例如,git hash-object和所有其他命令。在 JGit 中是否有一个很好的 API 来执行这些操作(我似乎找不到),或者您将如何做一些基本的事情,例如从输出流或文件写入 blob/您使用什么来代替 git 命令?git write-treegit commit-tree

4

4 回答 4

3

欢迎使用JGit API。除了包org.eclipse.jgit.api中的高级瓷器 API 之外,低级 API 并没有与原生 git 的管道命令密切相关。这是因为 JGit 是一个 Java 库而不是命令行界面。

如果您需要示例,请先查看 > 2000 JGit 测试用例。接下来看看 EGit 是如何使用 JGit 的。如果这没有帮助,请返回并提出更具体的问题。

于 2012-08-23T18:34:08.043 回答
1

如果有,它应该在JGit中。

例如,DirCache对象(即 Git 索引)有一个WriteTree 函数

/**
 * Write all index trees to the object store, returning the root tree.
 *
 * @param ow
 *   the writer to use when serializing to the store. The caller is
 *   responsible for flushing the inserter before trying to use the
 *   returned tree identity.
 * @return identity for the root tree.
 * @throws UnmergedPathException
 *   one or more paths contain higher-order stages (stage > 0),
 *   which cannot be stored in a tree object.
 * @throws IllegalStateException
 *   one or more paths contain an invalid mode which should never
 *   appear in a tree object.
 * @throws IOException
 *   an unexpected error occurred writing to the object store.
 */
public ObjectId writeTree(final ObjectInserter ow)
于 2012-07-12T09:25:40.843 回答
1

git hash-object <文件>

import java.io.*;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.ObjectInserter.Formatter;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;

public class GitHashObject {
    public static void main(String[] args) throws IOException {
        File file = File.createTempFile("foobar", ".txt");
        FileOutputStream out = new FileOutputStream(file);
        out.write("foobar\n".getBytes());
        out.close();
        System.out.println(gitHashObject(file));
    }

    public static String gitHashObject(File file) throws IOException {
        FileInputStream in = new FileInputStream(file);
        Formatter formatter = new ObjectInserter.Formatter();
        ObjectId objectId = formatter.idFor(OBJ_BLOB, file.length(), in);
        in.close();
        return objectId.getName(); // or objectId.name()
    }
}

预期输出:323fae03f4606ea9991df8befbb2fca795e648fa如在不使用 Git 的情况下分配 Git SHA1
中所讨论的

于 2013-11-05T13:11:05.403 回答
0

我正在寻找和你一样的东西。我使用 git 作为 kv 数据库来描述我们的数据结构。所以我想将 git 风格的管道 API 或 Jgit 风格的管道 API 包装为 CRUD API。然后我找到了org.eclipse.jgit.lib.ObjectInserter。

https://download.eclipse.org/jgit/site/5.10.0.202012080955-r/apidocs/index.html

https://download.eclipse.org/jgit/site/5.10.0.202012080955-r/apidocs/org/eclipse/jgit/lib/ObjectInserter.html

我认为CRUD的大多数C需求都可以通过包装ObjectInserter来实现。

于 2021-01-11T10:08:47.490 回答