for Mac OS X, brew install findutils gawk coreutils
source: git-cache-meta --store
destination: git-cache-meta --apply
#!/usr/bin/env bash | |
#git-cache-meta -- simple file meta data caching and applying. | |
#Simpler than etckeeper, metastore, setgitperms, etc. | |
#from http://www.kerneltrap.org/mailarchive/git/2009/1/9/4654694 | |
#modified by n1k | |
#modified by the-mars | |
#modified by bizonix | |
# - save all files metadata not only from other users | |
# - save numeric uid and gid | |
# 2012-03-05 - added filetime, andris9 | |
# 2012-05-22 - added fix for non ASCII characters and list size, merge chgrp into chown command | |
# 2014-03-18 - the-mars: store properties for dirs too | |
# 2015-04-17 - time zone offset fallback; fix leading-dash-name error; avoid deeper find; | |
# better quote file names; better directory listing; merge short opts; by Danny Lin | |
# 2015-05-07 - for Mac OS X, `brew install findutils gawk coreutils` | |
: ${GIT_CACHE_META_FILE=.git_cache_meta} | |
if [[ "$OSTYPE" == "darwin"* ]]; then | |
GNU='g' | |
fi | |
for bin in find touch awk ; do | |
BIN=$( echo $bin | tr '[:lower:]' '[:upper:]') | |
eval ': ${'$BIN':=$(which $GNU$bin)}' | |
if [ "$GNU" == 'g' ] && ! [[ "${!BIN}" =~ /$GNU$bin ]] ; then | |
echo "gnu version of '$bin' file not found." >&2 | |
exit 1 | |
fi | |
done | |
: ${Tz:=$($FIND -prune -printf '%Tz')} | |
: ${Tz:=$(date +%z)} | |
if ! [ "$Tz" ]; then | |
echo "%z not supported in 'strftime' in C library." >&2 | |
exit 1 | |
fi | |
case $@ in | |
--store|--stdout) | |
case $1 in --store) exec > $GIT_CACHE_META_FILE; esac | |
{ git ls-tree --name-only -rdz $(git write-tree) | xargs -0 -I NAME $FIND ./NAME -maxdepth 0 \ | |
\( -printf 'chown -h %U:%G \0%p\n' \) , \ | |
\( \! -type l -printf 'chmod %#m \0%p\n' \) , \ | |
\( -printf $TOUCH' -hcmd "%TY-%Tm-%Td %TH:%TM:%TS '$Tz'" \0%p\n' \) , \ | |
\( -printf $TOUCH' -hcad "%AY-%Am-%Ad %AH:%AM:%AS '$Tz'" \0%p\n' \) | |
git ls-files -z | xargs -0 -I NAME $FIND ./NAME -maxdepth 0 \ | |
\( -printf 'chown -h %U:%G \0%p\n' \) , \ | |
\( \! -type l -printf 'chmod %#m \0%p\n' \) , \ | |
\( -printf $TOUCH' -hcmd "%TY-%Tm-%Td %TH:%TM:%TS '$Tz'" \0%p\n' \) , \ | |
\( -printf $TOUCH' -hcad "%AY-%Am-%Ad %AH:%AM:%AS '$Tz'" \0%p\n' \) | |
} | $AWK 'BEGIN {FS="\0"}; {print $1 "'\''" gensub(/'\''/, "'\''\\\\'\'''\''", "g", $2) "'\''" }' ;; | |
--apply) sh -e $GIT_CACHE_META_FILE;; | |
*) 1>&2 echo "Usage: $0 --store|--stdout|--apply"; exit 1;; | |
esac |
for Mac OS X, brew install findutils gawk coreutils
source: git-cache-meta --store
destination: git-cache-meta --apply