3

在 JGit 中添加或更新文件的简单方法如下:

  git.add().addFilepattern(file).call()

但这假设该文件存在于 Git 工作目录中。如果我有一个多线程设置(使用 Scala 和 Akka),有没有办法只在裸存储库上工作,直接将数据写入 JGit,避免首先将文件写入工作目录?

为了获取文件,这似乎适用于:

  git.getRepository().open(objId).getBytes()

添加或更新文件是否有类似的东西?

4

1 回答 1

3

“添加”是一种将文件放入索引的高级抽象。在裸存储库中,您缺少索引,因此这不是功能之间的 1:1 对应关系。相反,您可以在新提交中创建文件。为此,您将使用 anObjectInserter将对象添加到存储库(请每个线程一个)。然后你会:

  1. 通过插入其字节(或提供 )将文件的内容作为 blob 添加到存储库InputStream

  2. 使用TreeFormatter.

  3. 创建一个指向树的提交,使用CommitBuilder.

例如,要创建一个包含您的文件的新提交(没有父项):

ObjectInserter repoInserter = repository.newObjectInserter();
ObjectId blobId;

try
{
    // Add a blob to the repository
    ObjectId blobId = repoInserter.insert(OBJ_BLOB, "Hello World!\n".getBytes());

    // Create a tree that contains the blob as file "hello.txt"
    TreeFormatter treeFormatter = new TreeFormatter();
    treeFormatter.append("hello.txt", FileMode.TYPE_FILE, blobId);
    ObjectId treeId = treeFormatter.insertTo(repoInserter);

    // Create a commit that contains this tree
    CommitBuilder commit = new CommitBuilder();
    PersonIdent ident = new PersonIdent("Me", "me@example.com");
    commit.setCommitter(ident);
    commit.setAuthor(ident);
    commit.setMessage("This is a new commit!");
    commit.setTreeId(treeId);

    ObjectId commitId = repositoryInserter.insert(commit);

    repoInserter.flush();
}
finally
{
    repoInserter.release();
}

现在您可以git checkout将提交 id 返回为commitId.

于 2013-05-17T13:47:37.257 回答