我可以使用 git 专家的一些指导,以确保对非裸存储库的推送操作安全。基本上我有一个关于如何做到这一点的计划,并且可以使用一些关于该计划是否合理的建议:)
通常,当您在 git 中推送到非裸存储库时,其工作副本和索引不会更新。正如我发现的那样,如果您忘记稍后手动更新它们,这可能会导致严重的问题!
在我们的小组中,我们有一些“中央”存储库,人们可以从中克隆和推回,但许多人也希望能够克隆他们的克隆,并根据需要以真正的分布式方式在它们之间推/拉。为了确保安全,我想确保通过“clone”或“init”创建的每个存储库都有一个自动安装的 post-receive 钩子,它将在推送操作后更新工作目录和索引以与新的头。
我发现我可以通过在 hooks 子目录中使用我的 post-receive 钩子创建一个模板目录来实现这一点,然后让我组中的每个人都执行以下操作:
git config --global init.templatedir /path/to/template/dir
目前我的 post-receive 钩子看起来像这样:
export GIT_WORK_TREE=..
git checkout -f HEAD
这似乎可以按预期工作,但我对 checkout 命令有一些不确定性。为了将工作目录和索引与 HEAD 中的状态同步,“git checkout -f HEAD”和“git reset --hard HEAD”是否等效?
我问是因为虽然我知道“git reset --hard HEAD”会做我想做的事,但在接收后挂钩中使用它会在我的测试中大大减慢推送操作(它似乎重新检查了所有文件,无论文件在工作目录中是脏的还是干净的)。“git checkout -f HEAD”似乎可以更快地完成同样的事情(给我一个干净的工作目录和与 HEAD 同步的索引),但考虑到 checkout 命令倾向于即时执行,我有点紧张与未提交的工作目录更改合并。这个命令真的会给我一个工作目录和索引,在所有情况下都与 HEAD 中的状态完全匹配(包括,例如,文件删除、重命名等)?
提前感谢您的任何建议!