git checkout - 如何在切换分支时保持时间戳?

Dal*_*ter 10 git rsync

我经常在分支之间来回切换.我有一个脚本,它将结帐的内容推送到"运行"环境,在那里我可以看到代码运行并测试它(它是一个Web应用程序).此推送脚本的核心使用rsync,它使用时间戳来检测应该传输哪些文件.因为git-checkout似乎将文件的时间戳设置为当前时间,所以rsync报告所有文件都被推送,只是因为时间戳将被更新.

如何在分支之间切换时让git-checkout保留时间戳,以便rsync仅报告内容更改?

我不想使用rsync的校验和参数,因为它非常慢.

Von*_*onC 8

Git 2.2.2 +(2015年1月)的情况应该更好(关于git checkout和timestamps).

对于在执行a时已经是最新的文件,时间戳不应再移动git checkout.

提交c5326bd杰夫·金(peff):

checkout $ tree:不要丢弃未更改的索引条目

当我们" git checkout $tree"时,我们:

  • 将路径拉入索$tree引,然后
  • 检查结果条目到工作树.

不过,我们第一步的方法相当严厉; 即使内容相同,它也会破坏整个现有的索引条目.
这意味着我们丢失了我们的统计信息,导致checkout_entry稍后用相同的内容重写整个文件.

相反,让我们看看我们是否已经在索引中有相同的条目,在这种情况下我们将它保留在原位.这让checkout_entry做对了.
我们的测试包括两个有趣的案例

  1. 我们确保不会重写没有更改的文件.
  2. 我们确保更新索引中未更改的文件(相对$tree),但是更改了工作树.
    我们保留旧索引条目,checkout_entry能够意识到我们的统计信息已过期.


Emi*_*Sit 5

git checkout更新时间戳的原因是几乎所有源代码构建系统都依赖于时间戳来确定是否需要重新构建目标.如果git checkout在更新文件时未更新文件的时间戳,则这些构建系统将无法正确执行增量构建.实际上,git checkout应该只更新已更改的文件的时间戳.

rsync应该有效地更新时间戳,并且如果仅元数据已经改变则不传输任何数据.您可以使用"加速"来验证这一点.您还可以询问最新版本rsync以使用-i标志逐项更改.你可以告诉rsync没有留出使用时间戳(只有使用校验),-a-t但不建议由rsync(1)手册页.