Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find Git Revision of a Working Directory Missing the .git Directory

I've got a) a working directory without the .git directory and b) a repository. a is some revision in the middle of the history of b.

How can I find out, which revision a matches in b?

I thought of a shellscript doing a diff from the working directory to all revisions and pick the one with the least (hopefully 0) differences.

That would be a bit raw (and I'm not sure how to do it), is there an easier way?

like image 390
fabb Avatar asked Oct 15 '11 17:10

fabb


People also ask

How do I find my working directory in git?

git directory is a configuration file for git. Use the terminal to display the . git directory with the command ls -a . The ls command lists the current directory contents and by default will not show hidden files.

Do you need the .GIT folder?

A . git folder is required to log every commit history and every other information required for your remote repository, version control, commits etc. These things are saved in different folders which have different meanings. Once the folder is created, open it and see the contents of the folder.

How do I change my working directory in git?

To change this current working directory, you can use the "cd" command (where "cd" stands for "change directory"). For example, to move one directory upwards (into the current folder's parent folder), you can just call: $ cd ..

What is the git working directory?

The Git directory contains the history of all the files and changes. The working tree contains the current state of the project, including any changes that have made. The staging area contains the changes that have been marked to be included in the next commit.


1 Answers

You could write a script to run diff gitdir workdir | wc -c for each commit. Then you could collate the results and say the commit which has the smallest difference (as measured by wc -c) is the closest commit to the bare working dir.

Here is what it might look like in Python:

find_closest_sha1.py:

#!/usr/bin/env python
import subprocess
import shlex
import sys
import os
import operator

gitdir,workdir=map(os.path.realpath,sys.argv[1:3])
os.chdir(gitdir)
proc=subprocess.Popen(shlex.split('git rev-list --all'),stdout=subprocess.PIPE)
shas,err=proc.communicate()
shas=shas.split()
head=shas[0]
data={}
for sha1 in shas:
    subprocess.Popen(shlex.split('git checkout {s}'.format(s=sha1)),
                          stderr=open('/dev/null')).wait()
    proc=subprocess.Popen(shlex.split('diff {g} {w}'.format(g=gitdir,w=workdir)),
                          stdout=subprocess.PIPE)
    out,err=proc.communicate()
    distance=len(out)
    data[sha1]=distance
answer=min(data.items(),key=operator.itemgetter(1))[0]
print('closest match: {s}'.format(s=answer))
subprocess.Popen(shlex.split('git checkout {h}'.format(h=head)),
                 stderr=open('/dev/null')).wait()

Example:

% rsync -a gitdir/ workdir/
% cd workdir
% git checkout HEAD~10
HEAD is now at b9fcebf... fix foo

% cd ..
% /bin/rm -rf workdir/.git
% find_closest_sha1.py gitdir workdir
closest match: b9fcebfb170785c19390ebb4a9076d11350ade79
like image 75
unutbu Avatar answered Oct 20 '22 20:10

unutbu