使用JGit提交一个字符串

8

一个JGit初学者的问题:

我使用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提交该文件吗?还是可以将String "on-the-fly"直接写入同一文件名的仓库中?
在Web上是否有使用JGit进行提交的示例?

关于CommitCommand的示例,我建议您查看我的答案这里 - Luca Geretti
1
我也建议使用瓷器API(即AddCommandCommitCommand),如答案中所建议的那样。但是,如果你真的想要在飞行中提交,你可能会发现这篇文章很有用:http://www.codeaffine.com/2014/10/20/git-internals/。 - Rüdiger Herrmann
3个回答

6

我认为除了合并或其他非常特定的操作外,没有其他方法可以提交任何数据,而使用CommitCommand是唯一的方法。

因此,您应该在文件中进行任何更改,然后使用API中的AddCommand和CommitCommand添加并提交更改。


好的,我会尝试这个,因为它似乎是最简单的方法,也许稍后再进行优化。 - Sonson123

4

当然,您可以按照自己的意愿进行操作,但不能使用Add/Commit,因为它们是Porcelein API的一部分,该API仅仅是在低级API的基础上构建了一个方便的API,因此它们只实现了最常见的用例。

您需要做的是查看AddCommandCommitCommand的实现,以了解如何使用低级API创建BLOB对象、树对象和提交对象。

我建议您彻底阅读《Pro Git》第9章,以便您正确理解Git的低级工作原理。


3
您可能需要了解在Git中使用Blob。此技术用于存储签署标签时的公共PGP密钥。看起来您仍然需要将内容放入文件中,但它可以是临时文件。当有人执行pull操作时,该文件不会存在于主目录中。它将作为blob条目出现在树中。
参考链接: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中的所有内容都依赖于哈希值,即使您找到了直接写入字符串的方法,我认为您也不应该这样做。您应该使用相同的文件名重新提交对象,以获得新的哈希值和更新的条目。


嗯,非常有趣,谢谢。但我会继续使用Add/CommitCommand,因为它现在是最简单的。 - Sonson123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接