【问题标题】:How to do a git pull with an in-memory database in JGit? [duplicate]如何在 JGit 中使用内存数据库执行 git pull? [复制]
【发布时间】:2015-07-02 23:31:51
【问题描述】:

我想创建一个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
  • 我不是这方面的专业人士,但我从未听说过有人尝试进行内存中的 git 访问——不过我有一个建议。尝试将存储库加载到临时目录中(使用文件.deleteOnExit 函数(通过 File.mkdirs 创建目录时),然后将所有这些文件加载​​到内存中,保存所做的任何修改,然后将 git 与临时目录重新同步..
  • no HEAD 可能意味着您需要先签出某个分支(checkout master 或其他任何分支)
  • @LeGEC 你能画出 git 命令的顺序吗?现在,我正在这样做:1)git init 2)git remote add origin ... 3)git pull origin。当我从命令行使用 git 时,它通常是这样工作的。
  • @DmitriPisarenko :尝试了解在您的new Git(repo) 命令和您的git.init().call() 命令之后的活动分支是什么。去查看 JGit 的文档以了解更多关于它是如何工作的细节。

标签: java git jgit


【解决方案1】:

要附加文件,您需要一个非裸存储库(具有工作目录的存储库。This mailing list post 声明,即

瓷器命令在某些情况下假定为文件基础,尤其是在涉及工作树时。如果您自己完成工作,您可以在内存存储库中执行插入操作,但瓷器命令不能以这种方式工作。

虽然您可以do without the procelain commands,但我也建议(就像上面评论的@Wayne)克隆到临时存储库,附加到文件,推送然后删除存储库。

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 2020-12-13
    • 2011-09-15
    • 2011-05-31
    • 2016-01-07
    • 1970-01-01
    • 2021-09-26
    • 2012-11-06
    • 2016-01-22
    相关资源
    最近更新 更多