4

短篇故事:

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

很长的故事:

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

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

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

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

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

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

代表版本的表格

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

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

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

4

1 回答 1

0

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

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

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

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

于 2012-04-15T01:01:51.563 回答