Skip to content

Instantly share code, notes, and snippets.

@xai xai/find-by-hash.sh forked from mloberg/gist:3750653
Last active Mar 13, 2019

Embed
What would you like to do?
Find file in git based on md5 checksum.
#!/bin/sh
usage() {
echo "Usage: $0 [-m] [-s] hash file"
echo "\t-m use md5 for hashing"
echo "\t-s use sha1 for hashing (this is the default)"
exit 1
}
HASHCMD="sha1sum"
while getopts ":m:s" opt; do
case $opt in
m)
HASHCMD="md5sum"
shift
;;
s)
HASHCMD="sha1sum"
shift
;;
esac
done
CHECKSUM=$1
FILE=$2
if [ -z "$CHECKSUM" -o -z "$FILE" ]; then
usage
fi
# Check if valid git repo
ROOT=$(git rev-parse --show-toplevel)
if [ $? -ne 0 ]; then
echo "Not a valid git repo."
exit 1
fi
cd $ROOT
# git revision for file
REVS=$(git rev-list --all -- $FILE)
# temp file
file_to_check=$(mktemp)
# check each revision for checksum
FOUND=""
for rev in $REVS; do
git show $rev:$FILE > $file_to_check 2>/dev/null
if $HASHCMD $file_to_check | grep -q $CHECKSUM; then
FOUND="$rev"
# intentionally no break to see if we find an older revision
# insert a break if you want the most recent commit instead of the oldest
fi
done
# cleanup
rm $file_to_check
# output
if [ -n "$FOUND" ]; then
echo "$FOUND"
exit 0
else
echo "Not found: $CHECKSUM $FILE"
exit 1
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.