Git阻止直接提交签出repo

时间:2014-12-04 11:07:10

标签: git

我遇到以下情况:我正在共享一个脚本的Git存储库,用于通过同时承载数据的共享文件系统处理特定数据集。检出了回购(非裸),因此可以轻松运行它们并且文件是可写的,因此可以访问共享文件系统(可信用户)的其他人可以更新它们。更新工作流程是

  1. 克隆到homedir,
  2. 提交更改,
  3. 从homedir拉入共享仓库(因为推送到已签出的仓库不会更改已签出的代码)。
  4. 现在我想强制执行此策略并阻止直接提交到存储库。我知道这不能以防水的方式完成,因为文件必须是可写的,但我至少想要用“不直接提交,请参阅git commit”的消息替换README。我怎么做?我试过了

    git config alias.commit invalid-command-see-README
    

    但这根本没有改变git commit行为。

5 个答案:

答案 0 :(得分:3)

也许您想重新考虑您的工作流程。您说您将进入共享存储库,因为推送到已签出的存储库不会更改已签出的代码。这不完全正确。你可以编写一个 post-recieve 钩子来完成这个。

此外,您可以编写预提交挂钩,禁止直接提交。

看一下git hooks,以便更好地理解我的意思。

答案 1 :(得分:2)

预提交挂钩可以修改或拒绝提交。

echo 'echo Commits to this repository are disabled. Please push or pull changes from yours instead.; exit 1' > .git/hooks/pre-commit
chmod +x !$

(编辑:“或拉”)

Zeeker's比我好。去接受那个。

答案 2 :(得分:1)

  

我试过

     

git config alias.commit invalid-command-see-README

这不会起作用。大多数git命令本身就是shell脚本,任何依赖git commit的命令都会被破坏。来自git config帮助页面

  

为避免混淆和使用脚本的麻烦,隐藏的别名   现有的git命令被忽略。

我认为通过将您的仓库分成两半并将存储库与已发布的脚本分开来更好。然后,您可以完全锁定repo(通过您自己编写gitolite的钩子),并且作为更新脚本的一部分,您可以将脚本发布到共享位置。

没有好的解决方案可以让用户进入仓库来提取更改但无法提交。

答案 3 :(得分:0)

您可以考虑使用gitolite。使用gitolite,您可以为每个用户配置权限。所以你可以给那些不应该只提交READ权限的用户。

答案 4 :(得分:0)

更新:建议预先提交以阻止本地提交

怎么样:

  • 通过始终返回错误结果(非零状态)来中止本地提交的预提交挂钩
  • 一个预接收挂钩,通过始终返回错误结果(非零状态)来中止传入推送

https://www.atlassian.com/git/tutorials/git-hooks/

  

预提交

     

每次运行git commit时都会执行预提交脚本,然后Git会要求开发人员提交提交消息或生成提交对象。

     

...

     

预接收

     

每次有人使用时都会执行预接收挂钩   git push将提交推送到存储库。它应该始终存在于   作为推送目标的远程存储库,而不是   原始存储库。