【问题标题】:Tracking changes to hooks in .git/hooks跟踪 .git/hooks 中的钩子的变化
【发布时间】:2011-05-26 07:34:26
【问题描述】:

有没有办法跟踪 git hook 的变化?我有三个只显示在我的机器上的钩子,而不是当我的其他开发人员获取时。尝试git add 不起作用。

【问题讨论】:

  • 我也很想回答这个问题!我无法将描述推送到我的网络服务器。我已经看到建议在受控目录中使用符号链接,指向 .git 下的文件,但我无法让它工作
  • 我投票决定以最旧的完全相同的副本结束。这里还有两个:stackoverflow.com/questions/2050450/git-hooks-managementstackoverflow.com/questions/3462955/… 一般建议是对钩子进行符号链接,可以是整个目录,也可以像我在这两个链接中的第二个中建议的那样,以一种更高级的方式逐个链接。
  • 我已经完成了符号链接的方式,但是对于初始克隆,需要先完成一个设置。不是世界末日,但似乎这是一个不错的功能。
  • 这就是为什么你在存储库中放置一个脚本来处理它,所以它只是克隆后的一个步骤。

标签: git githooks


【解决方案1】:

http://benjamin-meyer.blogspot.com/2008/10/git-hooks.html

.git/hooks 目录中的文件不是存储库的一部分,因此不会被跟踪。一种解决方法是在存储库的顶部有一个 git_hooks 目录,就像在 Arora 中所做的那样,并在克隆时将 .git/hooks 符号链接到 git_hooks。这样,钩子将成为项目的一部分,处于修订控制之下,每个人都可以访问。

【讨论】:

  • 编辑:.git/* 目录中的文件不是存储库的一部分,因此不会被跟踪。
  • +1 很棒的提示 - 只需要记住符号链接,但是看到 git_hooks 目录应该是一个很好的提醒......
  • @kfmfe04 你不需要记住任何东西 :) 只需使用 build script
【解决方案2】:

我知道这个问题已经有好几年了,但我觉得对于像我这样最终来到这里的旅行者来说,这需要说一下:Hooks 不是按设计跟踪的! Brian 的回答会奏效,但要解决的问题是,您实际上是在信任与您一起工作的其他所有人,不会将恶意代码放入存储库中,然后您的钩子会毫无疑问地执行;这就是安全漏洞的定义。

【讨论】:

  • 好点!但这可以通过将这个git_hooks 目录放在完全独立的项目中来解决,并且只允许有足够知识并且他们负责更改的人进行回购。
  • 我一直在运行rake spec,并相信我不会与将system("rm -rf / --no-preserve-root") 放入Rakefile 的精神病患者一起工作。我看不出相信我的合作者没有向 git hooks 提交恶意代码有什么不同...
  • @lamont 有时代码是恶意的,但程序员不是。如果您觉得您可以在一定程度上信任与您一起工作的人,那就太好了,但这并没有改变钩子没有被设计跟踪并且因此。
  • 我了解签入存储库的代码可能是恶意的。我已经运行了在我的 repo 上运行 FileUtils.rm_rf(".") 的单元测试,并完全清除了我的本地树(并且可以轻松地破坏我的主目录)。我的论点是,git-hooks 的特权并不比我每天运行的 repo 中的其他成千上万行代码中的任何一个都高。这一切都有能力毁掉我的一天。你能解释一下 git hooks 和我的单元测试框架和测试之间的根本区别吗?
  • @PhilipAdler:我不是说你应该只拉代码!我刚刚指出“仅拉”操作不会触发 git 钩子。因此,您可以在复制钩子之前毫无风险地检查钩子的内容。但确实可以在之后修改钩子。所以把它们联系起来似乎很危险。但是在你之前检查它们时复制是没有风险的。
【解决方案3】:

修改布赖恩的回答以考虑菲利普的重点:

如果您有任何具有写入权限的用户使用“#!/bin/sh rm -rf ~”创建一个钩子(例如,提交后),那么您的主目录就会出现。 (或者也许是更温和但仍然愚蠢的东西。)

为了防止这种情况,最好不要对目录进行符号链接,而是手动将它们复制到 git_hooks 目录中或从 git_hooks 目录中复制出来。是的,您必须记住在更新这些文件时手动复制这些文件,但总比没有好,而且您仍然没有授予某人对您机器上命令的用户级访问权限。

更新:如下所述,如果你打算改变你的钩子一堆,你可以制作一个包装脚本来复制文件然后运行提交。然而,自动化提交(使用 git add 并输入自动消息)确实很麻烦。一个更好的主意是让你的一个钩子在提交之前复制到这个“git_hooks”目录。这样恶意用户将无法提交将在下一次挂钩调用时运行的文件。

【讨论】:

  • 你不需要记住任何东西 :) 只需使用build script。然后,如果您有不同的想法,您可以进行符号链接或复制或其他任何操作。
【解决方案4】:

使用模板目录。从 git 克隆中,您可以使用标志 --template=<template_directory> 将文件添加到 $GIT_DIR。您还需要创建一个包含您的模板的目录或使用 gits 提供的位置 /usr/share/git-core/templates。通过使用模板目录,您可以准备好一个活动钩子,以便从创建时在钩子目录中运行。

我不确定您的人员多久进行一次编辑,但您可以将此模板保存在所有人都可以访问的存储库中。实际上,这应该是一个在 repo 中运行一个文件的钩子,该文件包含您需要自动运行的所有代码。

就像其他人提到的那样,一旦您自动执行未知代码,您就会面临风险。

【讨论】:

    【解决方案5】:

    恢复这个旧线程,您可以拥有一个单独的版本控制目录,其中包含您的钩子,然后使用 git config core.hooksPath 定位该目录。

    【讨论】:

    • 那么您如何确保团队中的任何人在提交代码之前进行此配置?
    • @PageNotFound 您将说明放入项目的 README 中,并将 linting 步骤添加到管道中的某个阶段,以防有人忘记构建失败时会提醒他们。不理想,但在实践中效果很好。
    【解决方案6】:

    另一种解决方案(与跟踪/版本控制无关)可能是使用为您处理挂钩的插件。

    例如: 对于 Web 应用程序,假设您可以在包 json 中添加一个脚本来配置预提交挂钩!

    这是一个很好的例子: https://github.com/typicode/husky

    最后,这个脚本可以在版本控制下,你不必处理 .git 中的 hooks 文件夹

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2019-04-22
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多