当我使用" git clone ...
"命令克隆git存储库时,我本地存储库中的所有克隆文件都具有相同的修改时间,其中包含git clone
发出命令的日期和时间.
有没有办法克隆远程git存储库与每个文件的实际修改时间?
Von*_*onC 22
Git 不记录文件的时间戳,因为它是一个分布式 VCS(意味着你的计算机上的时间可能与我的不同:时间和日期没有"中心"概念)
在这个答案中解释了不记录元数据的官方论点.
但是你可以找到试图恢复有意义日期的脚本,比如这个(或同一个想法的更简单版本).
重置 mtime 的另一个选项是git-restore-mtime。
sudo apt install git-restore-mtime # Debian/Ubuntu example
git clone <myurl>
cd <mydir>
git restore-mtime
Run Code Online (Sandbox Code Playgroud)
我发现user11882487 的答案的一个较短的变体更容易理解:
git ls-files | xargs -I{} git log -1 --date=format:%Y%m%d%H%M.%S --format='touch -t %ad "{}"' "{}" | $SHELL
Run Code Online (Sandbox Code Playgroud)
您可以在git存储库中检索所有文件的最后修改日期。(延迟提交时间) https://serverfault.com/q/401437/267639
然后使用touch
命令更改修改日期。
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
Run Code Online (Sandbox Code Playgroud)
另外我要点这里。
感谢PT的评论。
我已经更新了答案和要点,以支持带空格的文件名。
小智 5
这个Linux一线软件将修复所有文件(不是文件夹-只是文件)-它还将修复文件中带有空格的文件:-
git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | perl -ne 'chomp;next if(/'"'"'/);($d,$f)=(/(^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d(?: \+\d\d\d\d|)) (.*)/);print "d=$d f=$f\n"; `touch -d "$d" '"'"'$f'"'"'`;'
Run Code Online (Sandbox Code Playgroud)