当前位置: 首页 > 知识库问答 >
问题:

用JGit提交一个字符串

鲁博瀚
2023-03-14

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 写入一个文件,并使用 AddCommand 和 CommitCommand 提交此文件?或者,我可以将 String“即时”写入具有相同文件名的存储库吗?

网络上有没有一个示例如何使用JGit进行提交?

共有3个答案

居星阑
2023-03-14

您可能需要研究在Git中使用Blob。该技术用于在标记签名时存储公共PGP密钥。看起来您想要的内容仍然必须放入文件中,但它可以是临时文件。当有人执行拉取操作时,该文件将不存在于主目录中。它将作为一个blob在树中出现。

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

-w告诉它写条目并返回散列。

git hash-object -w myfile.txt
6ff87c4664981e4397625791c8ea3bbb5f2279a3

使现代化

我在手机上浏览了一下这个条目,因此没有注意到你提供的细节。是的,你需要把字符串写到一个文件中,但是不,你不应该像普通文件一样添加它。我怀疑JGit有能力做< code >散列对象。看起来您已经有了一些代码来处理BLOB条目。也许有一个更高层次的hash-object调用,其中您不直接处理BLOB。

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

冀景明
2023-03-14

是的,你当然可以做你想做的,但只是不使用添加/提交,因为它们是高级波切林应用编程接口的一部分,它只是建立在低级应用编程接口之上的便利应用编程接口。因此,他们只是实现了最常见的用例。

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

我再次建议你通读一下Git专业书籍的第9章,这样你就能正确理解Git在底层是如何工作的。

龙学
2023-03-14

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

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

 类似资料:
  • 我需要将提交的内容存储在字符串中,这将是从例如master到最新提交的差异。 如何使用JGit显示提交之间的更改底部答案与我想要的非常相似 这是链接中的代码 格式()方法是无效的,似乎没有办法返回字符串或某种输出流。 我希望会有一些类似于 我知道这在库中不存在,但是必须有一些东西可以将提交的内容放入可以转换为字符串的内容中。

  • 问题内容: 在连接到仓库以及添加,提交甚至循环提交文件的消息方面,我已经设法掌握了jGit文件的基础知识。 我接下来要做的是能够获取单个文件的所有提交消息,然后能够将单个文件还原回特定的参考/时间点。 问题答案: 这是基于所有父提交查找提交更改的方法 (标量代码) 请注意,TreeFilter.ANY_DIFF适用于单个树遍历器,并将返回根提交中可用的所有元素。 然后,您将不得不遍历树以查看您的文

  • 我正在尝试使用jgit将单个blob直接提交到存储库中。我知道如何插入blob并获得它的sha1,但是我很难为这个场景构建一个树。我似乎不知道如何正确地使用jgit的树抽象(TreeWalk之类的)来递归地构造一个树,几乎与以前的提交相同,只是blob的父树不同。 在JGit中执行此操作的惯用方法是什么? 我之所以这么问,是因为我正在编写一个程序,它类似于git存储库中文档的编辑器。在我的例子中,

  • 问题内容: 我正在尝试使用JGit来获取从上次提交到最近未提交的更改的文件差异。我该如何使用JGit?(使用命令行将是的输出git diff HEAD) 经过几次讨论(link1,link2),我附带了一段代码,该代码可以查找未提交的文件,但无法获取文件的区别 更新 这个问题是很久以前的。我现有的for确实显示了未提交的代码。prepareTreeParser在显示差异的上下文中,我正在使用的当前

  • 在 IntelliJ 平台上提交更改时,有没有办法让它检查提交消息的第一行是否不超过 50 个字符的长度限制? 现在,我通常用IDE主窗口(格式为< code>line:character)右下角的位置指示器来手动检查。然而,该指示器有时会被其他工具窗口隐藏,需要我将光标放在第一行的末尾。有没有一些我可以启用的设置或者一些我可以安装的插件,让IDE帮我检查一下?

  • 问题内容: 我有以下代码,基本上它正在执行两个操作。第一个是将我的表单数据提交到google电子表格,另一个操作是将我的第二个表单文本框值数据提交到另一个页面文本框值。这个怎么做? 从上面可以看到,这是第一页,第二页是第二种形式的Sankranthi_Reserv2.asp。我想在那儿传递文本框值,所以问题是第一种形式是提交给Google文档并存储数据,但是第二种形式需要将手机号码文本框值传递给下