【问题标题】:Fix permissions with git post-merge使用 git post-merge 修复权限
【发布时间】:2011-06-09 19:46:26
【问题描述】:

在我工作的一台服务器上,我们必须以 root 身份登录(原因我不会在这里讨论)。我们设置了一个用于 Web 服务器的 git 存储库,但是由于文件是以 root 身份创建的,因此 git 修改的文件具有错误的权限。

我创建了一个非常简单的合并后挂钩,我认为它可以解决问题。

#!/bin/bash
. git-sh-setup
chown -R www-data:www-data $GIT_DIR

我将其放入具有执行权限的.git/hooks/post-merge,但该文件似乎从未运行。这是我第一次尝试设置钩子,所以可能我遗漏了一些明显的东西。

我注意到的一件事是大多数钩子都有一个.sample 文件,而合并后没有。 (git 版本 1.7.4)

提前致谢!

【问题讨论】:

  • 您是否尝试添加echo 或编写tmp 文件以确保它没有运行?为什么是 post-merge(在 git pull 上)而不是 post-receive(在 git push 上)?如果您不直接在服务器上执行git pull,则该特定挂钩(post-merge)将不会运行。 . git-sh-setup 行应该做什么?
  • 我确实尝试过编写一个临时文件。它似乎没有被执行。我确实直接在服务器上拉。我的理解是 git-sh-setup 准备了必要的环境变量。
  • 您可以发布您在拉取时使用的实际命令(并期望脚本运行)吗?
  • 不是拉的时候,而是合并的时候。即git merge origin/feature-branch。理想情况下,我还希望这个钩子与git reset 一起运行。真的,任何时候 git 触及这个目录中的任何文件,我都想运行钩子。
  • 嘿,我知道这是一个旧线程,但你有没有想过?我希望将chgrp -R group_name $GIT_DIR 添加为文件post-merge。在下面没有看到任何好的答案...:q

标签: git permissions merge githooks


【解决方案1】:

您可能已经知道,但您可能想在合并后挂钩中检查 EOL 字符 (CR)。这可以解释为什么你的钩子没有执行(正如另一个问题git-hook-post-merge-error-cannot-run中提到的那样。

如果这不是解决方案,您还可以考虑另一种方法来解决您的问题。当存储库中的文件在服务器上发生更改时,您可以执行一项任务来执行对目录的所有者更改。 Cron 任务本身不会根据文件系统更改做出反应,但您可以尝试使用 inotify 之类的东西来对服务器 git 存储库中的任何更改做出反应。

我希望这两条信息可以解决您的问题,或者至少让您更接近。祝你好运。

【讨论】:

  • 没错,inotify 会起作用。看起来没有更好的方法。
【解决方案2】:

确保将脚本添加到超级用户组所有权。

【讨论】:

  • 脚本是作为 root 创建的。
【解决方案3】:

也许你正在寻找post-receive hook,如果你希望执行远程存储库的脚本被推送到。

【讨论】:

  • 不,我想使用合并后挂钩。
【解决方案4】:

看看“git 成就”的工作方式。将 git 包装在脚本中并在任何命令中执行您需要的操作会更容易。钩子更多地是为远程仓库而不是本地设计的。合并是您在本地执行的操作,因此您不会从挂钩机制中找到太多帮助。

链接:

http://benjamin-meyer.blogspot.com/2010/03/git-achievements.html

希望对你有帮助

【讨论】:

  • 为什么乱七八糟? Git 是用来编写脚本的。事实上,您使用的大多数 git 命令实际上都是 bash 脚本。不要试图用钩子将圆钉固定在方孔中。合并是将其工作集中在工作树中的东西。脚本是您的专长。
  • 好吧,如果钩子按我预期的方式工作,我的解决方案将是一个两行,也许是三行 shell 脚本。为 git 编写包装器虽然可能仍然相当简单,但至少要复杂一个数量级。
猜你喜欢
  • 2011-12-16
  • 2013-04-14
  • 2013-03-29
  • 2013-07-17
  • 1970-01-01
  • 2016-01-30
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多