Arturo and I were going through our commit logs for ooni-probe this morning when he noted that git commits leak geodata through timezone settings. I figured git would have an easy way to set the timezone to GMT, but it turns out that it uses mktime() to get a struct representing the system clock time. There’s a few hacks already for dealing with this, namely setting GIT_AUTHOR_DATE with the —date command:
$ git commit --date="Wed Feb 16 14:00 2037 +0100"
This is not only annoying, but it also doesn’t set GIT_COMMITTER_DATE, so if you wrote the patch and also committed it to a repo, your timezone still leaks.
I thought this was all incredibly annoying, and I don’t want to change my system clock, so I made a bash script to fix it:
#!/bin/bash #_____________________________________________________________________________ # Git Nowhere #----------------------------------------------------------------------------- # # Use: Run as "$ . ./gitdate.sh" before "$ git commit" to manually set # the date to GMT in order to obscure timezone-based geodata tracking. # # If you would always like your timestamps to be obscured for a specific # project, then place this script in /usr/local/bin/. Next, edit # /your_project_path/.git/hooks/pre-commit and place in it the following two # lines: # # #!/bin/sh # exec source /usr/local/bin/gitdate.sh # # @author Isis Lovecuft, 0x2CDB8B35 isis@patternsinthevoid.net # @version 0.0.3 # # v0.0.3: Also changes the months and years, because that would suck if your # commits were accidentally made last year # v0.0.2: Changes the days too# v0.0.1: Changes the hours #_____________________________________________________________________________ DAY=$(date | cut -d ' ' -f 1) MONTH=$(date | cut -d ' ' -f 2) DATE=$(date | cut -d ' ' -f 4) TIME=$(date | cut -d ' ' -f 5) TIMEZONE="+0000"YEAR=$(date | cut -d ' ' -f 7) HOUR=$(echo "$TIME" | cut -d ':' -f 1) MINUTE=$(echo "$TIME" | cut -d ':' -f 2) SECOND=$(echo "$TIME" | cut -d ':' -f 3) # Git uses the system time settings through mktime(). Do a "$ git log" to see # the timezone offset for your system. This script assumes -0700. For # example, if "$ git log" says your timezone is -0500, you would change all # occurences in the next code block of "7" to "5" and change "17" to "19". TIMEOFFSET=7 if [ "$HOUR" -lt "17" ]; then let HOUR+=7else let TILMIDNIGHT=24-HOUR let FALSEDAWN=TIMEOFFSET-TILMIDNIGHT let HOUR=FALSEDAWN fi # If the hour is one digit, prepend a zero. if [ "${#HOUR}" -eq "1" ]; then HOUR=$(printf "%02d" $HOUR) fi # If it is tomorrow in UTC, make sure we increment the day. if [[ -n "$FALSEDAWN" ]]; then if [ "$DAY" = "Mon" ]; then NEXTDAY=$(echo "Tue") elif [ "$DAY" = "Tue" ]; then NEXTDAY=$(echo "Wed") elif [ "$DAY" = "Wed" ]; then NEXTDAY=$(echo "Thu") elif [ "$DAY" = "Thu" ]; then NEXTDAY=$(echo "Fri") elif [ "$DAY" = "Fri" ]; then NEXTDAY=$(echo "Sat") elif [ "$DAY" = "Sat" ]; then NEXTDAY=$(echo "Sun") elif [ "$DAY" = "Sun" ]; then NEXTDAY=$(echo "Mon") fi DAY=$NEXTDAY if [[ "$MONTH" = "Jan" ]] || [[ "$MONTH" = "Mar" ]] || [[ "$MONTH" = "May" ]] || [[ "$MONTH" = "Jul" ]] || [[ "$MONTH" = "Aug" ]] || [[ "$MONTH" = "Oct" ]] || [[ "$MONTH" = "Dec" ]]; then if [[ "$DATE" -lt "31" ]]; then let DATE+=1 elif [[ "$DATE" -eq "31" ]]; then if [[ "$MONTH" = "Jan" ]]; then NEXTMONTH=$(echo "Feb") elif [[ "$MONTH" = "Mar" ]]; then NEXTMONTH=$(echo "Apr") elif [[ "$MONTH" = "May" ]]; then NEXTMONTH=$(echo "Jun") elif [[ "$MONTH" = "Jul" ]]; then NEXTMONTH=$(echo "Aug") elif [[ "$MONTH" = "Aug" ]]; then NEXTMONTH=$(echo "Sep") elif [[ "$MONTH" = "Oct" ]]; then NEXTMONTH=$(echo "Nov") elif [[ "$MONTH" = "Dec" ]]; then NEXTMONTH=$(echo "Jan") let YEAR+=1 fi DATE=1 fi elif [[ "$MONTH" = "Feb" ]] && [[ "$DATE" -lt "28" ]]; then let DATE+=1 elif [[ "$MONTH" = "Feb" ]] && [[ "$DATE" -eq "28" ]]; then NEXTMONTH=$(echo "Mar") DATE=1 elif [[ "$MONTH" = "Apr" ]] || [[ "$MONTH" = "Jun" ]] || [[ "$MONTH" = "Sep" ]] || [[ "$MONTH" = "Nov" ]]; then if [[ "$DATE" -lt "30" ]]; then let DATE+=1 elif [[ "$DATE" -eq "30" ]]; then if [[ "$MONTH" = "Apr" ]]; then NEXTMONTH=$(echo "May") elif [[ "$MONTH" = "Jun" ]]; then NEXTMONTH=$(echo "Jul") elif [[ "$MONTH" = "Sep" ]]; then NEXTMONTH=$(echo "Oct") elif [[ "$MONTH" = "Nov" ]]; then NEXTMONTH=$(echo "Dec") fi DATE=1 fi fi if [[ -n "$NEXTMONTH" ]]; then MONTH=$NEXTMONTH fi fi export GIT_AUTHOR_DATE=$(echo "$DAY $MONTH $DATE $HOUR:$MINUTE:$SECOND $YEAR $TIMEZONE") export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE unset NEXTMONTH unset DAY unset MONTH unset DATE unset HOUR unset MINUTE unset SECOND unset YEAR unset TIMEZONE unset TILMIDNIGHT unset FALSEDAWN unset NEXTDAY unset TIMEOFFSET