1. ホーム
  2. git

[解決済み] 古いファイルを元の作成/変更タイムスタンプでチェックアウトする

2023-03-31 07:23:57

質問

元の作成/変更のタイムスタンプを知る、または取得する方法はありますか?

どのように解決するのですか?

Git データベースに記録されるタイムスタンプは、作者とコミットのタイムスタンプだけだと思います。 ファイルのタイムスタンプを最新のコミットに一致するように修正する Git のオプションは見当たりませんし、これがデフォルトの動作でないことは理にかなっています (そうであれば、Makefile は正しく動作しないためです)。

ファイルの更新日時を最新のコミット時刻に設定するスクリプトを書くことができます。 それは次のようなものでしょう。

# No arguments? Recursively list all git-controlled files in $PWD and start over
if [ $# = 0 ]; then
  git ls-files -z |xargs -0 sh "$0"
  exit $?
fi

for file in "$@"; do
  time="$(git log --pretty=format:%cd -n 1 \
                  --date=format:%Y%m%d%H%M.%S --date-order -- "$file")"
  if [ -z "$time" ]; then
    echo "ERROR: skipping '$file' -- no git log found" >&2
    continue
  fi
  touch -m -t "$time" "$file"
done

これは、引数として特定のファイルを受け取るか、さもなければ現在のディレクトリかその子ディレクトリにあるgit管理下の各ファイルを更新します。これは、ファイル名の中にスペースや改行があってもよいように git ls-files -z はヌル文字で終端するファイル一覧を出力し xargs -0 は null-terminatedなリストを引数にパースします。

多くのファイルがある場合、これはしばらく時間がかかります。