git clone更改文件修改时间

use*_*761 30 git clone

当我使用" git clone ..."命令克隆git存储库时,我本地存储库中的所有克隆文件都具有相同的修改时间,其中包含git clone发出命令的日期和时间.

有没有办法克隆远程git存储库与每个文件的实际修改时间

Von*_*onC 22

Git 不记录文件的时间戳,因为它是一个分布式 VCS(意味着你的计算机上的时间可能与我的不同:时间和日期没有"中心"概念)

在这个答案中解释了不记录元数据的官方论点.

但是你可以找到试图恢复有意义日期的脚本,比如这个(或同一个想法更简单版本).

  • 但它可以节省远程端的本地时间.在根据修改时间编译文件时,如何解决构建问题? (3认同)
  • 好的,感谢您的回复和建议的解决方案.我看到了讨论,但是因为git是版本控制系统而没有保存mod时间的论据对我来说看起来并不强烈.我使用CVS多年,它有这个功能,它不会伤害它.确实,简单的ls -ltr命令显示从CVS存储库检出的已修改文件的顺序. (3认同)
  • 构建依赖于文件的修改时间的事实实际上是_不_将其存储为元数据的一部分的原因。如果 mtime _is_ 更新到提交时间,您必须在检出旧提交后开始干净构建,因为文件将被认为比相应的派生文件更旧,并且不会导致它们被重建。(显然,假设构建系统依赖于 mtime。) (2认同)
  • 这样可以节省UTC时间,不是吗? (2认同)
  • @VonC,您永远无法保证您的时间是正确的。不过,这不是放弃使用时间的原因。 (2认同)

mik*_*dge 7

重置 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)


Nea*_*ltz 6

我发现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)


ERU*_*ERU 5

您可以在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)

另外我要点这里

2019年10月更新

感谢PT的评论。
我已经更新了答案和要点,以支持带空格的文件名。

  • 杰出的!奇迹般有效。对于我们来说,这至关重要,因此我们可以加快基于“Makefile”的构建速度。 (2认同)
  • @barlop git 历史并不总是实际编辑的历史,它可以通过修改和 rebase -i 来修改。这是作者选择呈现的_逻辑_历史,其中提交是对一组文件的逻辑_原子_同时更改。如果您想记录“file1 在 file2 之前更改”,那么它们之间必须存在一个点 - 这些必须是单独的提交。 (2认同)

小智 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)