当我使用“git clone ...
”命令克隆git存储库时,我本地存储库中的所有克隆文件都具有相同的修改时间,其中包含发出git clone
命令的日期和时间。
有没有办法克隆远程git存储库,每个文件的实际修改时间?
答案 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
,以避免日期时间转换问题。