我理解每次更改文件时更新修改时间的默认Git行为,但有时我想恢复文件的原始修改时间.
有没有办法告诉Git这样做?
(例如,在处理大型项目时,我做了一些更改configure.ac,发现autotools在我的系统上不起作用,并希望将其恢复configure.ac到原始内容和修改时间,这样make就不会尝试configure用我破损的autotools 更新.)
小智 19
将文件列表的修改时间恢复到上次提交的作者日期
gitmtim(){ local f;for f;do touch -d @0`git log --pretty=%at -n1 -- "$f"` "$f"; done;}; gitmtim configure.ac
Run Code Online (Sandbox Code Playgroud)
但它不会递归地更改目录.
如果您想要更改整个工作树,例如在新的克隆或结帐后,您可以尝试
git log --pretty=%at --name-status --reverse | perl -ane '($x,$f)=@F;next if !$x;$t=$x,next if !defined($f)||$s{$f};$s{$f}=utime($t,$t,$f),next if $x=~/[AM]/;'
Run Code Online (Sandbox Code Playgroud)
注意:我在builtin/clone.c中使用了utime并且没有匹配.
Chr*_*sen 17
Git没有这样做.就像链接的常见问题解答说的那样,它会破坏使用基于时间戳的依赖性分析工具,比如make.
想想如果将旧时间戳应用于从"旧"提交检出的文件会发生什么:
但是,如果你真的想要它,所有信息都在那里.你可以编写自己的工具来做到这一点.
在你的情况下,只需使用类似的东西touch -r configure configure.ac来重置修改时间configure.ac,(或随时带来配置touch configure).
实际上,如果你想练习阅读C代码,这对于读者来说是一个简单的"练习".更改时间戳的功能是utime或utimes.搜索代码以获取这些函数的使用(提示:git grep utime在git.git克隆中).如果有一些用途,请分析代码路径以找出更新时间戳的时间.
以下shell脚本应该适用于任何POSIX兼容系统,以设置所有跟踪文件(和目录)的修改和访问时间戳.我可以确定的唯一缺点是它很慢但是对我的用例来说很好(在生成发布档案时设置正确的日期).
rev=HEAD
for f in $(git ls-tree -r -t --full-name --name-only "$rev") ; do
touch -d $(git log --pretty=format:%cI -1 "$rev" -- "$f") "$f";
done
Run Code Online (Sandbox Code Playgroud)
我相信'正确'的修复方法是实际比较每个输入文件的SHA1,看它是否从上一次构建中改变了.
这是很多工作,但是我已经开始了一个项目来尝试创建概念证明(仍处于非常早期阶段).除了确定正确的构建步骤之外,它还旨在为以后的取证创建输入文件的审核列表.
请参阅http://github.com/alecthegeek/gitbuilding - 它基于几年前与SVN类似的内容
https://github.com/MestreLion/git-tools
sudo apt install git-restore-mtime
cd [repo]
git restore-mtime
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23435 次 |
| 最近记录: |