Git:安全推送非裸存储库

Dav*_*vid 3 git git-post-receive

我可以使用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中的状态完全匹配(包括,例如,文件删除,重命名等)?

提前感谢任何建议!

Kar*_*ldt 5

我可能误解了这个问题.你真的想要设置它,这样任何人都可以推送到开发人员的工作目录,而他正在进行未提交的更改吗?任何一段话都不能使其"安全".

大多数人所做的是拥有他们正常的工作目录,这是私有的,并将其完全克隆到同一磁盘上的公共仓库中,然后共享该目录.这使用硬链接,所以你几乎不使用任何额外的空间.您将更改推送到同事的公开裸仓库中,当他准备接收更改时,他会进入工作目录.或者,你把你变成你的公共裸露回购,和你的同事从那里拉当他准备好了.推动非裸存储库很难建立的原因.