git-mtime is a Git extension that finds a last modified times through Git commits:
Git repositories provide records of deliberate updates through commit logs. By retrieving the last commit date for a specific file, we can find the last date a file was purposefully updated.
#!/bin/bash
path="${@: -1}"
dir=$(dirname "$path")
hash=$(git -C "$dir" log \
--format="%ad %H" \
--date=format:"%s" \
--grep="\[date skip\]" \
--invert-grep \
-- $(basename "$path") |\
sort -r |\
awk '{ print $2 }' |\
head -n1)
git -C "$dir" show --format="%ad" --quiet "${@:1:$#-1}" "${hash}"
Download git-mtime and symlink it to /usr/local/bin/git-mtime
:
curl --remote-name --silent https://raw.githubusercontent.com/jeffkreeftmeijer/git-mtime/main/git-mtime
ln -s $(realpath git-mtime) /usr/local/bin/git-mtime
Execute git mtime
with a path to a file in a Git repository:
git mtime file.txt
Mon Mar 6 18:24:11 2023 +0100
Even outside of the repository, git-mtime
can find the commit history and find a file's last update date:
git mtime repository/file.txt
Mon Mar 6 18:24:11 2023 +0100
By relying on git-log
internally, git-mtime
supports Git's --date
flag:
git mtime --date=format:"%F %R" repository/file.txt
2023-03-06 18:24
If a commit touches a file, but you don't want to modify the file's modified time, mark the commit with [date skip]
in its commit message to make git-mtime
ignore it:
echo "file.txt" >> repository/file.txt
git -C repository add .
git -C repository commit --quiet --message 'Fix file.txt' --message "[date skip]"
./git-mtime repository/file.txt
Mon Mar 6 18:24:11 2023 +0100