git clone更改文件修改时间

时间:2014-02-12 17:39:38

标签: git clone

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

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

8 个答案:

答案 0 :(得分:20)

Git does not record timestamp for the files,因为它是分布式 VCS(意味着您的计算机上的时间可能与我的不同:时间和日期没有“中心”概念)

解释了不记录元数据的官方论点in this answer

但您可以找到尝试恢复有意义日期的脚本like this one(或simpler version of the same idea)。

答案 1 :(得分: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'"'"'`;' 

答案 2 :(得分:1)

另一个重置mtime的选项是git-restore-mtime

sudo apt install git-restore-mtime # Debian/Ubuntu example
git clone <myurl>
cd <mydir>
git restore-mtime

答案 3 :(得分:1)

每个文件运行一次 log -1 令我厌烦,所以我写了这个来一次性完成所有这些:

( # don't alter any modified-file stamps:
  git diff --name-status --no-find-copies --no-renames | awk '$1="D"' FS=$'\t' OFS=$'\t'
  git log --pretty=%cI --first-parent --name-status -m --no-find-copies --no-renames
) | awk ' NF==1 { date=$1 }
          NF<2 || seen[$2]++ { next }
          $1!="D" { print "touch -d",date,$2 }' FS=$'\t'

它在 10 秒内完成 linux 历史记录(通过 shell 传输所有触摸命令需要一分钟)。

这是破坏的好方法,例如一分为二,我站在〜不要开始尝试超载文件系统时间戳的阵营,坚持这样做的人显然将不得不学习艰难的方式~,但我可以看到,也许有些工作流程不会对您造成伤害。

随便。但是,可以肯定的是,不要盲目地这样做。

答案 4 :(得分:0)

您可以检索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

也是我的要旨here

答案 5 :(得分:0)

@Chris的答案的一个简短变体,我发现它更容易理解:

git ls-files | xargs -I{} git log -1 --date=format:%Y%m%d%H%M.%S --format='touch -t %ad "{}"' "{}" | $SHELL

答案 6 :(得分:0)

添加到单行列表...

val recordCol = typemap.map{case (k,v) => when(col("type") === k, col(v))}.toSeq

val df2 = df.withColumn("record", coalesce(recordCol: _*)) 

答案 7 :(得分:0)

适用于上述多种解决方案:

使用 %at 格式,然后使用 touch -d \@$epochdelta,以避免日期时间转换问题。