How to get a copy of an older version of a file in a git repository?

jbranchaud picture jbranchaud · Feb 21, 2013 · Viewed 27.2k times · Source

I have a version of a .tex file from a number of commits ago that I would like to get a copy of. I have the sha1 hash value for the commit that has the version of that file that I want. I do not want to replace the current version of the file. Rather, I want to just get a separate copy of it that reflects its state at the older version.

A lot of similar questions suggest using git checkout <sha1> -- file.tex, but this just keeps giving "error: pathspec 'file.tex' did not match any file(s) known to git."

The file I am interested in originally existed in the top-level directory of the repository. I am currently in a sub-directory of the repository trying to run this command so as to get the older version of file.tex in the subdirectory.

Is this possible? How can I do this?

Answer

qqx picture qqx · Feb 21, 2013

You can use git cat-file to dump the contents of the file to the standard output and redirect that into your desired destination:

git cat-file -p <sha1>:./file.tex > wherever.tex

The ./ is necessary if you are in a subdirectory of the repository, if you're in the top-level of the repository it may be omitted. Also, that may not work in older versions of git, in which case you'd need to explicitly supply the full path to the file relative to the repository's root.