从索引中找出文件的SHA1

时间:2012-04-08 10:22:29

标签: java git jgit

短篇小说:

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

长篇故事:

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

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

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

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

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

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

Table representing versions

编辑:经过一番分析后,我发现我可以使用JGit DirCache来访问索引的内容。因此,使用DirCache类,我可以在索引中获取文件的SHA1,就像在question中一样。但是现在我看到这个哈希与我检出的修订哈希不一样。意思是,我无法使用此方法来确定检查表中的哪个修订版。

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

我目前解决此问题的方法是使用JGit AddNoteCommand。当用户签出修订版时,我只需在此修订版中添加一些注释,其中包含一些“key:value”。此密钥将指示是否签出修订版本。谁有更好的建议?

1 个答案:

答案 0 :(得分:0)

所以首先,很遗憾地说,但我认为做你做的事情是危险和不直观的。构建Git以便您使用分支。我认为你所做的是被称为独立头操作,不推荐使用它,即使JGit允许你做很多事情。 但如果你非常小心,你可以继续。

第二个Dircache(以前的索引)对象对我来说非常神秘,我想(虽然我不太确定)JGit团队仍在努力。

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

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