git签出-切换分支时如何维护时间戳?

git签出-切换分支时如何维护时间戳?,git,rsync,Git,Rsync,我经常在树枝间来回切换。我有一个脚本,它将签出的内容推送到一个“正在运行”的环境中,在那里我可以看到代码运行并测试它(这是一个web应用程序)。这个推送脚本在其核心使用rsync,并使用时间戳来检测真正应该传输的文件。由于git checkout似乎将文件上的时间戳设置为当前时间,rsync报告所有文件都被推送,只是因为时间戳将被更新 如何让git签出在分支之间切换时保留时间戳,以便rsync只报告内容更改 我不想使用rsync的checksum参数,因为它非常慢。git checkout更新时

我经常在树枝间来回切换。我有一个脚本,它将签出的内容推送到一个“正在运行”的环境中,在那里我可以看到代码运行并测试它(这是一个web应用程序)。这个推送脚本在其核心使用rsync,并使用时间戳来检测真正应该传输的文件。由于git checkout似乎将文件上的时间戳设置为当前时间,rsync报告所有文件都被推送,只是因为时间戳将被更新

如何让git签出在分支之间切换时保留时间戳,以便rsync只报告内容更改


我不想使用rsync的checksum参数,因为它非常慢。

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


rsync
应该能够高效地更新时间戳,并且如果只有元数据发生了更改,就不会传输任何数据。您可以通过“加速”来验证这一点。您还可以要求最新版本的
rsync
使用
-i
标记逐项列出更改。您可以通过省略
-a
-t
来告诉
rsync
不要使用时间戳(并且只使用校验和),但
rsync(1)
手册页不建议这样做。

似乎git这样做的唯一原因是在DVCS环境中,您可能使用旧的时间戳文件来更新新的时间戳文件,并导致生成问题。我认为这不好,因为我们很少使用旧的时间戳文件来更新新的时间戳文件

  • 我认为这可以用一种聪明的方式来处理:当用文件B更新文件a时

    文件_timestamp=(timestamp(B)>timestamp(A))?时间戳(B):时间戳(当前)

  • 或者,可以将其设计为可配置选项

  • 使用git 2.2.2+(2015年1月),情况(关于git签出和时间戳)应该会更好

    对于执行操作时已经是最新的文件,时间戳不应再移动

    见:

    签出$tree:不要丢弃未更改的索引项 当我们“
    git checkout$tree
    ”时,我们:

    • 将路径从
      $tree
      拉入索引,然后
    • 将结果项签出到工作树
    不过,我们第一步的方法相当苛刻;即使内容相同,它也会重击整个现有索引项。
    这意味着我们将丢失统计信息,导致
    结帐\u条目
    延迟 用相同的内容重写整个文件

    相反,让我们看看索引中是否已经有相同的条目,在这种情况下,我们将其保留在原位。这让结帐项做正确的事情。
    我们的测试包括两个有趣的案例:

  • 我们确保没有更改的文件不会被重写
  • 我们确保更新的文件在索引中保持不变(相对于
    $tree
    ),但工作树发生了更改。
    我们保留旧的索引条目,而checkout_条目能够意识到我们的统计信息已经过时

  • 你真的关心表现吗?或者只是rsync只列出了有内容更改的文件?@EmilSit我确实希望rsync速度快一点,这样它就不会妨碍我,我希望报告中不会出现对我来说“不真实”的更改(即不是真实的内容更改)。rsync目前对你来说慢吗?不,rsync很好,如果我尝试校验和模式,它会慢一点,ThoughtNote您的用例现在(2015年1月)使用Git2.2.2+应该工作得更好。看,我想我会把这个作为答案,因为它解释了git的行为。我想对于我的特定用例,git并没有真正的解决方案。如果“git checkout”有一个不触及时间戳的选项,如果构建系统是唯一的原因,那么ThanksIt会很好。例如,我有一个脚本,可以按上次修改日期对“git status”的输出进行排序,在切换了分支之后,这是毫无意义的!我有一个类似的案例。出于某种原因,git会接触所有文件。另外,我没有使用
    -a
    -t
    标志,但是
    rsync
    似乎认为文件已经更改了。我不能使用
    --size only
    ,因为即使字母发生了更改,我也需要更新文件,所以如果rsync只比较校验和,或者git保留原始修改时间,那就太好了。有什么想法吗?我编写了一个助手脚本来根据上次提交时间更新时间戳:有了这个脚本,您可以运行:git checkout&&git settimes该行为将破坏大多数构建系统,因为依赖文件的时间戳可能晚于timestam1和timestam2,这意味着它不会被重建——这将破坏构建。