在 JGit 中添加或更新文件的简单方法如下:
git.add().addFilepattern(file).call()
但这假设该文件存在于 Git 工作目录中。如果我有一个多线程设置(使用 Scala 和 Akka),有没有办法只在裸存储库上工作,直接将数据写入 JGit,避免首先将文件写入工作目录?
为了获取文件,这似乎适用于:
git.getRepository().open(objId).getBytes()
添加或更新文件是否有类似的东西?
在 JGit 中添加或更新文件的简单方法如下:
git.add().addFilepattern(file).call()
但这假设该文件存在于 Git 工作目录中。如果我有一个多线程设置(使用 Scala 和 Akka),有没有办法只在裸存储库上工作,直接将数据写入 JGit,避免首先将文件写入工作目录?
为了获取文件,这似乎适用于:
git.getRepository().open(objId).getBytes()
添加或更新文件是否有类似的东西?
“添加”是一种将文件放入索引的高级抽象。在裸存储库中,您缺少索引,因此这不是功能之间的 1:1 对应关系。相反,您可以在新提交中创建文件。为此,您将使用 anObjectInserter
将对象添加到存储库(请每个线程一个)。然后你会:
通过插入其字节(或提供 )将文件的内容作为 blob 添加到存储库InputStream
。
创建一个指向树的提交,使用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
.