devoured elysium
devoured elysium

Reputation: 105037

List ALL the files that ever existed in ANY branch in a git repository

I have some files I'm looking for, but that I don't know where they are located in my git repository (both in space and time). I also speculate it is possible that both the files and the branch in which they reside might be deleted.

How could I list every file ever in existence in the whole git repository? I know deleted files / branches could pretty well have already been garbage collected, and well, there's nothing to do about it than to pray it didn't happen already.

Thanks!

Upvotes: 6

Views: 483

Answers (1)

Colin Hebert
Colin Hebert

Reputation: 93157

This is a bit crazy, but it might do what you want:

#!/bin/sh

content="$@"

for hash in $({
    git rev-list --objects --all
    git rev-list --objects -g --no-walk --all
    git rev-list --objects --no-walk \
        $(git fsck --unreachable |
          grep '^unreachable commit' |
          cut -d' ' -f3)
    git fsck --unreachable | grep "^unreachable blob" | cut -d' ' -f3
} 2> /dev/null | cut -d' ' -f1 | sort | uniq); do
    if git cat-file blob $hash 2> /dev/null | grep -i $content > /dev/null ; then
        echo $hash
    fi
done

I tried to get absolutely every blob accessible, and look for a specific content in each of them.

You'll be able to do a git cat-file -p hash on each of the generated hashes and might find your lost file.


On a side note, I'm surprised to not see any nice way to list absolutely every object available in the repository. I was thinking of unpacking everything and go from there, that could be a better solution too.


Resources:

Related topics:

Upvotes: 3

Related Questions