How can I match a file to a git commit?

Let’s say as part of the build process for a website, I copy a git project to a web-accessible directory and remove the .git directory. Now, a few days later after I’m a few commits ahead of the public web directory, what’s a simple way to figure out which version of /index.html is currently being served?

# /var/www (public web dir):
/index.html

# Git repository:
HEAD:/index.html  
HEAD~1:/index.html
HEAD~2:/index.html
.
. <-- /var/www/index.html matches in here somewhere.
.
HEAD~N:/index.html

The only thing I can think to do is write a script to checkout every version of the file in git and check each one, but in my limited experience with git I’ve found that there is usually some canonical way to accomplish whatever git task I dream up.

  • git checkout: what does this weird output mean?
  • Jenkins pull request plugin triggers builds from all branches in a repo and not a specific branch
  • Can I copy one git repositories commit log to an (almost) identical repo with no history?
  • How to ignore files from 'git status' if only white spaces and line breaks changed
  • Filtering git commits from repository
  • How to use git metadata strategies compared to ClearCase ones?
  • Git tries to commit submodules files into parent project
  • Git split and purge
  • Squashing complete history before a certain tag
  • Git hub: I added a file but I want to exclude it from my next commit
  • Push existing project to remote server
  • Issues after trying to repack a git repo for improved performance
  • 3 Solutions collect form web for “How can I match a file to a git commit?”

    Using git-describe is a good idea. Also, you might consider using git-archive to generate a tarball rather than cloning the git repository and then deleting the .git directory. Keep the archive around and use git-get-commit-tar-id to find the commit. To answer your actual question, use git-hash-object to get the blob of the file in question, then see the answers to this Which commit has this blob?

    As part of your build process, run git describe > version_file and put that file with the rest of your files. This way you always have a reference to what commit the files are from.

    Another option if you want the info available to you in git while working is to set a reference to the commit as part of your build process, either a branch or a lightweight tag and overwrite it on every build.

    A final option that is closer to what you asked than what I assumed you ment, is to use the ident filter in .gitattributes to replace $Id$ in each file with the files hash. The problem with this though is that it will only allow you to figure out which commits (multiple) contain this exact version of the file and not which commit (single) the file came from.

    If you have a point in time that you know that the file matches you can use bisect to find when the file changed, so you don’t need to look at every version

    If you don’t know any revision that matches the file you would need to inspect all of the revisions

    Git Baby is a git and github fan, let's start git clone.