Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 904
jbranchaud Avatar asked Feb 21 '13 05:02

jbranchaud


People also ask

How do I find an old GitHub file?

On GitHub.com, navigate to the main page of the repository. Click to open the file whose line history you want to view. In the upper-right corner of the file view, click Blame to open the blame view.

How do I clone a specific version of GitHub?

In order to clone a specific branch, you have to execute “git branch” with the “-b” and specify the branch you want to clone. $ git clone -b dev https://github.com/username/project.git Cloning into 'project'... remote: Enumerating objects: 813, done.

How do I download old files from GitHub?

To download from GitHub, you should navigate to the top level of the project (SDN in this case) and then a green "Code" download button will be visible on the right. Choose the Download ZIP option from the Code pull-down menu. That ZIP file will contain the entire repository content, including the area you wanted.


3 Answers

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.

like image 187
qqx Avatar answered Oct 21 '22 12:10

qqx


Use git show with absolute repository paths:

workdir$ git show revision:repo/module/package/code.file > code.file.old

or paths relative to the current directory:

package$ git show revision:./code.file > workdir/code.file.old

In contrast to checking out a file, show does not intrinsically change your workspace, you can do anything you like with the output.

Credit to this answer, and of course see full details in the manual.

like image 12
gws Avatar answered Oct 21 '22 11:10

gws


I think that the best solution is to overwrite temporally your file. In your top-level of your repository:

git checkout <sha1> file.tex
cp file.tex directory
git checkout HEAD file.tex
like image 11
William Seiti Mizuta Avatar answered Oct 21 '22 11:10

William Seiti Mizuta