1

我使用 post-commit 脚本将“git archive”到临时目录,然后我使用 Rsync 将更改的文件移动到我的 dev 工作目录。我正在使用 rsync 保留时间戳,但是 git archive 命令将所有时间戳更新为当前日期和时间,所以一切都被推送了。根据文档(引用如下),只有在我传递树 ID 而不是提交 ID 时才应该这样做。我没有通过任何东西。

我要复制到 temp 的 git archive 命令:

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

这是文档中的内容:

“git存档在给定树ID与给定提交ID或标签ID时的行为不同。在第一种情况下,当前时间用作存档中每个文件的修改时间。在后一种情况下,提交时间记录在使用引用的提交对象。此外,如果使用 tar 格式,则提交 ID 存储在全局扩展 pax 标头中;可以使用 git get-tar-commit-id 提取它。在 ZIP 文件中,它存储为文件评论。”

这是否意味着我需要获取提交 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)

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

4

2 回答 2

2

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

git config --local receive.denycurrentbranch true

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

于 2019-08-29T18:46:23.760 回答
1

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

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

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

于 2019-08-29T20:44:17.557 回答