调用“git pull”;来自 git post-update hook

发布于 2024-09-15 11:40:56 字数 362 浏览 6 评论 0原文

我有一个使用 gitolite 设置的中央 git 存储库。

我想设置一个钩子,以便每当用户推送到存储库时,它都会在其他地方执行拉取,然后进行一些自动化测试。

到目前为止,我只想让它执行拉动操作。

在 hooks 目录中,我在更新后创建了以下脚本名称:

#!/bin/sh  
cd /home/git/www/epicac
git pull

当我使用 ./post-update 调用此脚本时,它完全按照我的要求执行。

然而,每当我挂接时自动调用它时,我都会得到: fatal: Not a git repository: '.'

知道为什么会发生这种情况吗?

I have a central git repo set up using gitolite.

I want to set up a hook such that whenever a user pushes to the repo, it performs a pull elsewhere followed by some automated testing.

So far, I only want to it perform the pull.

In the hooks directory I created the following script names post-update:

#!/bin/sh  
cd /home/git/www/epicac
git pull

When I invoke this script using ./post-update, it does exactly what I want.

However, whenever it's invoked automatically as I hook, I get: fatal: Not a git repository: '.'

Any idea why this might be happening?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不顾 2024-09-22 11:40:56

您可以按照此 SO 答案 中的建议运行各种诊断。

特别是 检查 GIT_DIRGIT_WORK_TREE 的值。

当挂钩运行时,GIT_DIR 和(如果无法从 GIT_DIR 推断出工作树)GIT_WORK_TREE 被设置。
这意味着您的拉取操作不会在您更改的目录中的存储库中运行。


另请参阅博客文章 在 Git Hook 中使用 Git

最终我们请来了 Linux 大师,他注意到 git 用户在钩子内运行的环境完全不同。
Gitolite 对环境做了很多事情,但让我们搞砸的是 GIT_DIR 的设置。
当我们弄清楚这一点后,解决方案就很简单:

ENV.delete 'GIT_DIR'

在我们的 ruby​​ 脚本中,由“post-receive”挂钩触发。


同样的交易
Git 提示:通过 post-receive hook 自动更新工作树
,但有一个优雅的方法:

解决办法?
事实证明,post-receive 挂钩以设置为 repo/.git 文件夹的 GIT_DIR 环境变量开始,因此没有无论您“cd”到哪个路径,总会尝试在那里运行任何后续的 git 命令
解决这个问题只需取消设置 GIT_DIR
(感谢 Ulrich Petri 提供的优雅的 env -i 解决方案):

#!/bin/sh
cd ..
env -i git reset --hard

You have various diagnostics to run as suggested in this SO answer.

In particular, check out the the value of GIT_DIR and GIT_WORK_TREE.

While the hook is running, GIT_DIR and (if the worktree can't be inferred from GIT_DIR) GIT_WORK_TREE are set.
That means your pull won't run with the repository in the directory you changed to.


See also blog post Using Git Inside a Git Hook:

Eventually we got our linux guru over and he noticed that the environment under which the git user runs is totally different when inside a hook.
Gitolite does a bunch of things to the env, but the one that was screwing us up was the setting of the GIT_DIR.
After we figured that out, the solution was as easy as:

ENV.delete 'GIT_DIR'

in our ruby script that is triggered by the 'post-receive' hook.


Same deal in
Git Tip: Auto update working tree via post-receive hook
, but with an elegant way out of this:

The solution?
It turns out the post-receive hook starts out with the GIT_DIR environment variable set to the repo/.git folder, so no matter what path you 'cd' into it will always try to run any following git commands there.
Fixing this is simply a matter of unsetting the GIT_DIR
(thanks to Ulrich Petri for the elegant env -i solution):

#!/bin/sh
cd ..
env -i git reset --hard
你对谁都笑 2024-09-22 11:40:56

如何指定--git-dir

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull

How about specifying the --git-dir.

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
策马西风 2024-09-22 11:40:56

只需一行即可完成此操作:

git -C /home/git/www/epicac pull

This should do the trick in just one line:

git -C /home/git/www/epicac pull
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文