我需要一些来自git专家的指导,关于如何使对非裸库的推送操作更加安全。基本上,我有一个计划,希望能得到一些关于这个计划是否合理的建议 :)
通常情况下,在git中向非裸库进行推送时,它的工作副本和索引不会被更新。正如我所发现的那样,如果你忘记手动更新它们,这可能会导致严重的问题!
在我们的团队中,我们有一些“中央”仓库供人们克隆并推回,但是许多人也希望能够克隆他们的克隆,并根据需要以真正的分布式方式进行推/拉操作。为了让这更加安全,我想确保每个通过“克隆”或“init”创建的仓库都自动安装了一个post-receive hook,该hook将在推送操作后更新工作目录和索引,以使其与新的HEAD同步。
我发现,我可以通过创建一个模板目录,其中包含hooks子目录中的我的post-receive hook,然后要求我们团队中的每个人执行以下操作来实现这一点:
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" 可以实现我的需求,但在我的测试中,在post-receive hook中使用它会显著减慢推送操作(似乎会重新检出所有文件,无论工作目录中的文件是干净的还是脏的)。"git checkout -f HEAD" 看起来可以更快地完成同样的事情(让我得到一个干净的工作目录和与HEAD同步的索引),但是考虑到checkout命令在进行未提交的工作目录更改时可能会进行即时合并,我有些紧张。这个命令是否确实会在所有情况下(包括例如文件删除、重命名等)给我一个与HEAD状态完全匹配的工作目录和索引?
非常感谢任何建议!