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