[小ネタ] Macでgit cloneした時のタイムスタンプを修正してみた

[小ネタ] Macでgit cloneした時のタイムスタンプを修正してみた
2019.05.30

はじめに

GitHubからgit cloneすると、cloneしたファイルのタイムスタンプはcloneした日時となります。 (GitHubのWebサイト上で見ると、〇〇 years agoや、☓☓ hours agoといった感じで最終編集日からの時間が表示されますが)

私はクラスメソッド入社以前にレガシー環境でデバッグやトラブルシュートをしていた時期があり、カジュアルに(エイリアスで)ls -lhrtなどと叩いて編集日時の情報から問題箇所のアタリをつける、といった癖があります。そのため、全てのファイルのタイムスタンプがファイルが編集された日ではなくcloneした日となることが、何となく気になっていました。

gitはタイムスタンプを考慮したバージョン管理を行っているわけではないのですが、編集した日時の情報は取得できるので、この情報を使ってcloneしたファイルのタイムスタンプを修正する簡単なbashスクリプトを作成してみました。

タイムスタンプ修正bashスクリプト

検証環境

  • Mac Book Pro (13-inch,2018)
  • GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)

bashスクリプト

#!/bin/bash

for FILE in $(git ls-files)
do
GIT_TIME=$(git log -1 --format=%ci $FILE | sed -e "s@.^[0-9]@@")
FORMATTED=$(date -j -f "%Y-%m-%d %H:%M:%S %z" "${GIT_TIME}" +%Y%m%d%H%M.%S)
touch -t "${FORMATTED}" "${FILE}"
echo "${FILE} (${GIT_TIME})"
done

簡単な説明

5行目:git logで取得した日時情報をsedで整形してGIT_TIMEに入れています。

6行目:7行目のtouchコマンドの書式に合わせるためdateコマンドを使って書式を変換しています。

7行目:touchコマンドでGIT_TIMEの日時に変更します。

ご注意点

  • ディレクトリのタイムスタンプは変わらないです。git管理下の(gitignoreではない)ファイルが変更対象になります。
  • dateのコマンドオプションの違いにより、(GNU dateの)Linux環境ですとこのままだと正しく動作しないためご注意下さい。(Mac上で動作するBSDのdateコマンドを想定しており、GNUのdate、gdateの場合はコマンドオプションが異なります。)
  • 本スクリプトはdateを使っているので非root権限のアカウントで実行下さい。dateコマンドの使い方については下の記事なども参照下さい。

Free BSD Manual Pages Date

Man Page of DATE (GNU)

エンジニアの入り口 - 日付を設定するdateコマンド

さいごに

小ネタですが、どなたかに届くと嬉しいです!