Created
July 30, 2011 13:04
-
-
Save jeffery/1115504 to your computer and use it in GitHub Desktop.
Update Timestamp of files in Checked-out Git Repository
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash -e | |
#### | |
# Helper script to update the Last modified timestamp of files in a Git SCM | |
# Projects working Copy | |
# | |
# When you clone a Git repository, it sets the timestamp of all the files to the | |
# time when you cloned the repository. | |
# | |
# This becomes a problem when you want the cloned repository, which is part of a | |
# Web application have a proper cacheing mechanism so that it can re-cache files | |
# (into a webtree) that have been modified since the last cache. | |
# | |
# @see http://stackoverflow.com/questions/1964470/whats-the-equivalent-of-use-commit-times-for-git | |
# | |
# Author: Jeffery Fernandez <[email protected]> | |
#### | |
# Make sure we are not running this on a bare Repository | |
REPO_TYPE=`git config --list|egrep ^core.bare | awk -F '=' '{ print $2 }'` | |
if [ "$REPO_TYPE" == "true" ] | |
then | |
echo "Cannot run this script on a bare Repository" && exit 1 | |
fi | |
echo "Updating Git Repository Last Modified Time-stamp" | |
# Obtain the Operating System | |
OS=${OS:-`uname`} | |
# Get the last revision hash of a particular file in the git repository | |
getFileLastRevision() | |
{ | |
git rev-list HEAD "$1" | head -n 1 | |
} | |
# Extract the actual last modified timestamp of the file and Update the time-stamp | |
updateFileTimeStamp() | |
{ | |
# Extract the file revision | |
FILE_REVISION_HASH=`getFileLastRevision "$1"` | |
# Get the File last modified time | |
FILE_MODIFIED_TIME=`git show --pretty=format:%ai --abbrev-commit ${FILE_REVISION_HASH} | head -n 1` | |
# Extract the last modified timestamp, differently for Linux, FreeBSD and Mac OS X | |
if [ "$OS" = 'Linux' ] | |
then | |
# for displaying the date in readable format | |
#FORMATTED_TIMESTAMP=`date --date="${FILE_MODIFIED_TIME}" +'%d-%m-%Y %H:%M:%S %z'` | |
#echo "Modified: ${FILE_MODIFIED_TIME} | ${FORMATTED_TIMESTAMP} > ${1}" | |
# Modify the last modified timestamp | |
touch -d "${FILE_MODIFIED_TIME}" $2 | |
elif [ "$OS" = 'Darwin' ] || [ "$OS" = 'FreeBSD' ] | |
then | |
# Format the date for updating the timestamp | |
FORMATTED_TIMESTAMP=`date -j -f '%Y-%m-%d %H:%M:%S %z' "${FILE_MODIFIED_TIME}" +'%Y%m%d%H%M.%S'` | |
#echo "Modified: ${FILE_MODIFIED_TIME} | ${FORMATTED_TIMESTAMP} > ${1}" | |
# Modify the last modified timestamp | |
touch -t "${FORMATTED_TIMESTAMP}" $2 | |
else | |
echo "Unknown Operating System to perform timestamp update" >&2 | |
exit 1 | |
fi | |
} | |
# Backup and update the "Internal Field Separator" to a newline. This is so that | |
# we can deal with spaces in file names in the for loop below | |
IFS_BAK=$IFS | |
IFS=" | |
" | |
# Loop through and fix timestamps on all files in our checked-out repository | |
for file in $(git ls-files) | |
do | |
updateFileTimeStamp "${file}" "${file}" | |
done | |
# Revert the default delimiter | |
IFS=$IFS_BAK | |
IFS_BAK= |
Hello Jeffery,
I needed this kind of script. I decide to improve it with dry-run mode, syncing only if file is not currenly modified, etc.
I only improved the Linux version (because I don't have MacOS X or BSD) to check for now.
https://github.com/tst2005/git-timesync/
Question: Your original code are licensed under what license ?
Regards,
@jeffery GREAT WORK ..... this works great on a local environment, but now I am trying to get this to work inside a TravisCI container and it just does not want to work. Any idea how to modify this for use inside TravisCI.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I get "Unknown Operating System to perform timestamp update" error.
How about Windows? Could you add support for it?