星期六, 10月 21, 2023

還原git簽出檔案的修改時間

執行 git clone 以後取得的修改時間是當下執行的時間,所以其實是沒辦法去判斷哪個檔案是七天前修改的,或是十天前修改的。

Stackoverflow 上有人問了相同的問題:Git clone changes file modification time – Stack Overflow

有人就回答了,其實 git 裡面沒有保留檔案修改時間的資訊,但可以有個 tricky 的方法,就是透過 git log 的資訊來變更檔案的修改日期:

git ls-tree -r --name-only HEAD | while read filename; do
  unixtime=$(git log -1 --format="%at" -- "${filename}")
  touchtime=$(date -d @$unixtime +'%Y%m%d%H%M.%S')
  touch -t ${touchtime} "${filename}"
done

這邊主要用到幾個指令,說明如下

  • git ls-tree 是取出檔案名稱
  • git log -1 --format 是取出檔案提交的日期,這邊取出的是 timestamp 值
  • date -d 將 timestamp 值,轉換為日期時間格式。
  • touch -t 依據指定的日期格式去設定檔案的修改日期。

這邊要注意,目錄的修改時間不會被更動到。

透過以上的腳本,就可以還原git簽出檔案的修改時間,然後再搭配 find 指令來找出七天前修改的檔案了。

沒有留言: