我想要一个纯文本指针指向git存储库中某个特定版本的文件 - 特别是修改了相关文件的修订版。
我可以这样做的一种方法是使用(path/to/file, revision)
元组,其中修订版本可以从git log --format=oneline path/to/file
获得。
有没有更有效的方法来实现这一目标?
我知道git's object database stores filenames separately from file data,但是有没有办法从文件名转换为该对象ID并再次返回?
答案 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
:
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
接受的格式(如上例所示)。