【问题标题】:Find out the SHA1 of a file from the index从索引中找出文件的 SHA1
【发布时间】:2012-04-08 10:22:29
【问题描述】:

短篇小说:

如标题所说,如何使用 JGit 从签出文件的索引中获取 SHA1 或哈希?

长篇大论:

我正在编写一个 GUI 应用程序并使用 JGit 来修改一个文件。因此,用户可以打开一个窗口,该窗口在一个漂亮的表格中包含该文件的所有修订。

用户可以进行更改并提交。此外,用户可以及时返回并从表中选择较旧的版本进行处理。

这个工作流程非常简单。我在内部对 JGit 所做的是我只使用一个分支(主分支)。 HEAD 总是指向这个分支,这个分支的尖端总是最新的提交。当用户选择旧版本时,我只需实例化 CheckoutCommand 类,使用 addPath() 设置文件路径并使用 setName() 使用分支 master

上述结果导致 HEAD 指向 master 分支,而 master 分支又指向最新版本(不是用户选择的版本)。但是索引和工作目录本身现在处于用户选择的修订版中。

所以,最后,我希望能够向用户展示表中的哪些修订当前已签出或激活,或者您想要调用的任何内容。此修订将在下面的屏幕截图中突出显示。但我不能为此目的使用主分支的尖端。我需要以某种方式从索引中获取 SHA1。

有一个问题posted 这正是我想要的,但在 JGit 的上下文中(问题的作者使用 git)。

编辑: 稍加分析后,我发现我可以使用 JGit DirCache 来访问索引的内容。因此,使用DirCache 类,我可以像在question 中一样在索引中获取文件的SHA1。但是现在我看到这个散列与我签出的修订散列不同。意思是,我不能使用这种方法来确定表中的哪个修订被签出。

那么,有没有其他方法可以使用我所描述的工作流程来确定用户选择进行哪些修订?甚至,也许有人可以提出不同的方法。

我目前解决这个问题的方法是使用 JGit AddNoteCommand。当用户签出修订版时,我将简单地在此修订版中添加一个带有一些“键:值”的注释。该键将指示修订是否已签出。谁有更好的建议?

【问题讨论】:

    标签: java git jgit


    【解决方案1】:

    首先,很抱歉这么说,但我认为这样做既危险又不直观。 Git 是为使用分支而构建的。我认为您所做的称为分离头操作,尽管 JGit 允许您做很多事情,但不推荐这样做。 但是如果你非常小心,你可以继续。

    第二个 Dircache(以前是 Index)对象对我来说非常神秘,我认为(虽然我不太确定)JGit 团队仍在研究它。

    最后,要真正回答这个问题:我认为您应该使用 LogCommand 及其 addPath(...) 方法。您将获得一个 RevCommit 列表,您可以从中确定 SHA1。我不完全记得你是如何获得 SHA1 的,我认为当你有一个 Ref 对象时你应该调用 getName() 。我猜你会在 StackOverflow 上找到它。

    但是,我建议根据您获得的 SHA1 使用分支(取决于您要在提交时执行的操作):您从刚刚找到的 SHA1 创建一个分支,并且可以安全地执行您想要的任何操作.然后,如果你不想提交任何东西,要么销毁分支,要么稍后合并它。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2010-10-02
      • 1970-01-01
      • 2020-08-27
      • 2021-10-31
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多