如何使用JGit在内存数据库中执行git pull操作?

6

我希望创建一个Java程序,它能够:

  1. 连接到特定的Git代码库
  2. 将文本追加到文件中
  3. 提交更改
  4. 将更改推送到该代码库中

理想情况下,所有这些都应该在内存中完成。

我正在使用JGit与Git进行交互:

InMemoryRepository repo = new InMemoryRepository(new DfsRepositoryDescription());
Git git = new Git(repo);
git.init().call();
PullCommand pull = git.pull();

StoredConfig config = git.getRepository().getConfig();
config.setString("remote", "origin", "url", "https://XXX");
config.save();

PullResult result = pull.call();

pull.call()会导致以下异常:

org.eclipse.jgit.api.errors.NoHeadException: Pull on repository without HEAD currently not supported
    at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:191)

如何将存储库的内容检索到内存中的JGit存储库中?


你需要发出一个 fetch 请求。 - user180100
我不是这个领域的专业人士,但我从未听说过有人尝试内存中访问git - 不过我有一个建议。尝试将存储库加载到临时目录中(使用File.mkdirs函数创建目录时使用File.deleteOnExit函数),然后将所有这些文件加载到内存中,保存所做的任何修改,然后重新同步git和临时目录。 - Wayne
1
“no HEAD” 可能意味着您需要首先检出某些分支(checkout master 或其他任何分支)。 - LeGEC
@LeGEC,你能画一下git命令的顺序吗?目前我是这样做的:1)git init 2)git remote add origin ... 3)git pull origin。当我从命令行使用git时,通常是这样工作的。 - Glory to Russia
@DmitriPisarenko:尝试理解在您的new Git(repo)命令和git.init().call()命令之后活动分支是什么。查看JGit文档以获取更多有关其工作原理的详细信息。 - LeGEC
我在这里添加了适用于你的案例的可工作代码:https://dev59.com/gYzda4cB1Zd3GeqPqcGx#54486558 - msangel
1个回答

3
要追加文件,您需要非裸库(即具有工作目录的库)。这篇邮件列表帖子指出:
“在某些情况下,瓷器命令假定以文件为基础,特别是涉及工作树时。如果自己完成工作,则可以将插入操作执行到内存库中,但是瓷器命令不会以这种方式工作。”
虽然您可以不使用瓷器命令,但我还建议(如上面@Wayne的评论)克隆到临时存储库,追加文件,推送,然后删除存储库。

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