在git中,是否有一个SHA1引用路径和修订的组合?

时间:2015-10-13 18:40:43

标签: git

我想要一个纯文本指针指向git存储库中某个特定版本的文件 - 特别是修改了相关文件的修订版。

我可以这样做的一种方法是使用(path/to/file, revision)元组,其中修订版本可以从git log --format=oneline path/to/file获得。

有没有更有效的方法来实现这一目标?

我知道git's object database stores filenames separately from file data,但是有没有办法从文件名转换为该对象ID并再次返回?

2 个答案:

答案 0 :(得分:4)

git rev-parse使看似困难的部分变得容易:

$ git rev-parse ace6325:Documentation/RelNotes/2.5.0.txt
994b113178d966f7044ebe7b17d981df26ecd022

您不需要原始SHA-1,任何可解析的修订都可以:

$ git rev-parse HEAD~5:Documentation/RelNotes/2.5.0.txt
994b113178d966f7044ebe7b17d981df26ecd022

鉴于SHA-1,git cat-file -p将提取其内容(或者您也可以使用git show; git show 可能尝试应用污迹过滤器;我不完全确定使用git show)。

请注意,此SHA-1是文件的实际内容的校验和,即,如果文件在一次提交中更改,则在稍后的提交中更改为SHA-1将恢复到旧的SHA-1。

答案 1 :(得分:3)

是。好吧,有点。在git中,文件在内部存储为一个名为blob的东西。 Blob由SHA-1以非常类似于提交的方式标识。您可以使用git hash-object

根据其内容找到任何文件的SHA-1
git hash-object -- <path>

如果要查找特定版本的文件的哈希值,git hash-object也接受来自标准输入的文件内容:

git show <revision>:<path> | git hash-object --stdin

然后,您可以使用git show检索该文件的文本:

git show <blob sha-1>

从blob id转到路径并进行修订要困难得多。 Blob可以存储在多个修订版本的多个路径中,因此实际上没有单个确定的路径/修订版组合存储blob。有可能找到一个包含给定blob的修订和路径的列表(参见Which commit has this blob?),但这很复杂,听起来并不像你想要的那样。

如果你真的想要一个特定版本的文件的文本表示,那么你对(<path>, <revision>)的原始想法对我来说似乎是完全合理的。 <revision>:<path>也会运作良好,因为这是git show接受的格式(如上例所示)。