我经常在分支之间来回切换。我有一个脚本,它将结账的内容推送到一个“运行”环境中,在那里我可以看到代码运行并对其进行测试(这是一个web应用程序)。这个推送脚本的核心是使用rsync,它使用时间戳来检测真正应该传输哪些文件。因为'git-checkout‘似乎会将文件上的时间戳设置为当前时间,所以rsync会报告所有文件都被上推,这只是因为时间戳将被更新。
如何让'git-checkout‘在分支之间切换时保留时间戳,以便rsync只报告内容更改?
我不想使用rsync的校验和参数,因为它非常慢。
发布于 2012-03-20 23:21:23
git checkout更新时间戳的原因是,几乎所有的源代码构建系统都依赖于时间戳来确定是否需要重新构建目标。如果git checkout在更新文件时没有更新文件上的时间戳,这些构建系统将不会正确地执行增量构建。事实上,git checkout应该只更新发生更改的文件的时间戳。
rsync应该能够高效地更新时间戳,并且如果只有元数据发生了更改,则不会传输任何数据。你可以用“加速”来验证这一点。您还可以要求最新版本的rsync使用-i标志逐项列出更改。您可以通过省略-a或-t来告诉rsync不要使用时间戳(并且只使用校验和),但rsync(1)手册页不建议这样做。
发布于 2015-02-01 04:27:23
git 2.2.2+的情况(关于Git签出和时间戳)应该会更好(2015年1月)。
执行git checkout时,对于已经是最新的文件,时间戳不应再移动。
请参阅Jeff King (peff)的commit c5326bd
签出$tree:不要丢弃未更改的索引项
当我们"
git checkout $tree“时,我们:
$tree拉入索引,然后不过,我们的第一步方法相当笨重;即使内容是相同的,它也会破坏整个现有的索引条目。
这意味着我们丢失了统计信息,导致checkout_entry稍后使用相同的内容重写整个文件。
相反,让我们看看索引中是否已经有相同的条目,在这种情况下,我们将其保留在适当的位置。这让checkout_entry做了正确的事情。
我们的测试涵盖了两个有趣的案例:
$tree相比),但有工作树更改。我们保留旧的索引条目,并且checkout_entry能够意识到我们的统计信息已经过期。
发布于 2013-05-24 09:10:39
似乎Git这样做的唯一原因是,在DVCS环境中,您可能会使用旧的时间戳文件来更新新的时间戳文件,从而导致构建问题。我不认为这很好,因为我们很少使用旧的时间戳文件来更新新的时间戳文件。
file_timestamp =(时间戳(B)>时间戳(A))?时间戳(B):timestamp(CURRENT);
https://stackoverflow.com/questions/9789446
复制相似问题