使用JGit提交字符串

时间:2012-04-12 16:22:54

标签: java jgit

JGit-beginner-question:

我使用JGit从存储库中读取文件(BLOB)并操纵其内容。之后,我想将具有相同文件名的新内容作为新提交写回存储库。但是如何使用JGit提交新内容?

我的伪代码:

String gitUrl = "path/to/repository/.git";
Repository repository = new FileRepository(gitUrl);
String filename = "test/seppl.txt";
blobId = getIdOf(filename);
ObjectLoader object = repository.open(blobId, Constants.OBJ_BLOB);
ObjectStream is = object.openStream();
String newContent = processStream(is);
// How to commit the newContent in filename?

我是否必须将newContent写入文件并使用AddCommandCommitCommand提交此文件?或者我可以使用相同的文件名将“即时”字符串写入存储库吗?

Web中是否有一个如何使用JGit进行提交的示例?

3 个答案:

答案 0 :(得分:6)

我认为没有其他方法可以提交任何数据而不是使用CommitCommand(合并或非常具体的此类操作除外)。

所以,是的,您应该对文件进行任何更改,然后添加并提交它(使用API​​中的AddCommand和CommitCommand)。

答案 1 :(得分:4)

是的,当然你可以做你想要的,但只是不使用添加/提交,因为它们是高级 Porcelein API的一部分,这只是一个便利的API构建< strong> 在低级API的顶部 。因此,他们只是实现了最常见的用例。

您需要做的是查看AddCommandCommitCommand的实现,以了解如何使用较低级别的API创建BLOB对象,然后使用树对象而不是提交对象。

我建议您彻底read chapter 9 of the Pro Git book,以便您正确理解Git如何在较低级别上运作。

答案 2 :(得分:3)

您可能希望在Git中使用Blob。签名标签时,此技术用于存储公共PGP密钥。看起来您想要的内容仍然必须放入文件中,但它可以是临时文件。当某人拉动时,该文件将不存在于主目录中。它将成为树中的一个条目。

http://book.git-scm.com/7_raw_git.html

-w告诉它写入条目并返回哈希值。

git hash-object -w myfile.txt
6ff87c4664981e4397625791c8ea3bbb5f2279a3

更新

我在手机上浏览了这个条目,因此不太注意你提供的细节。是的,您需要将字符串写入文件,但不应该像普通文件一样添加它。我怀疑JGit有能力hash-object。看起来你已经有了一些代码来处理BLOB条目。也许对hash-object有一个更高级别的调用,你不直接处理BLOB。

考虑到Git中的所有东西都依赖于内容的散列,我会说,即使你确实找到了直接写字符串的方法,你也不应该这样做。您应该重新使用具有相同文件名的对象,以便获得新的哈希和更新的条目。