如何使用 git 存档保留时间戳

How do I preserve timestamps with git archive

我使用 post-提交脚本 'git archive' 到一个临时目录,然后我使用 Rsync 将更改的文件移动到我的开发工作目录。我使用 rsync 保留时间戳,但是 git archive 命令将所有时间戳更新为当前日期和时间,因此所有内容都被推送。根据文档(在下面引用),只有在我向它传递树 ID 而不是提交 ID 时才应该这样做。我没有传递任何东西。

我的 git 存档命令复制到临时文件:

git archive $branch | (cd $tempdir; tar x)

文档是这样说的:

"git archive behaves differently when given a tree ID versus when given a commit ID or tag ID. In the first case the current time is used as the modification time of each file in the archive. In the latter case the commit time as recorded in the referenced commit object is used instead. Additionally the commit ID is stored in a global extended pax header if the tar format is used; it can be extracted using git get-tar-commit-id. In ZIP files it is stored as a file comment."

这是否意味着我需要获取提交 ID 并将其传递给 git 存档?我怎么做?

我有点懵?如何在不更改时间戳的情况下存档到我的临时目录?

谢谢。

编辑:我也试过这些都无济于事:

git archive get-tar-commit-id $branch | (cd $tempdir; tar x)

git archive $(git get-tar-commit-id) $branch | (cd $tempdir; tar x)

我不确定正确的语法是什么。也许这比我想象的要容易?

我使用的一个工作流程是制作一个非裸遥控器,还有

git config --local receive.denycurrentbranch true

然后服务器可以有一个真正的工作目录,您可以推送到该目录。

如果 $branch 是分支名称,它首先被解析为提交哈希,然后 git archive 归档与该提交关联的树。因此,您现有的 git archive 命令正在执行您想要的操作。

问题是 所有 文件的时间戳将是该提交的日期戳。毕竟,每次提交都是每个文件的完整快照。所以存档中的每个文件都有相同的时间戳:来自该提交的时间戳。你想要 git archive 做的不是你想要 git archive 做的。 :-)

如果您有一个相当现代的 Git,请使用您已将 receive.denyCurrentBranch 设置为 updateInstead 的非裸存储库设置服务器。 (然后确保没有人在 服务器上做任何工作!--bare 存储库的要点是强制执行缺少正在完成的工作。)你的工作-服务器上的树将执行您真正想要的操作。