问题标签 [githooks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5116 浏览

git - 让远程 git 存储库在推送时拒绝合并提交

我想做的事:

我想禁止将任何合并提交送到中央存储库。唯一的例外是如果合并是在中央存储库中存在的分支之间。我想在中央存储库中强制执行此操作。

解释我为什么要这样做:

注意:如果这个解释让你偏离了我想要做的事情,那么忽略这个解释。当然,我很高兴听到解决我在下面解释的问题的其他方法,但我感兴趣的答案是我想要做的事情,如上所述。

我有一个中央 git 存储库,其中有几个开发人员跟踪的分支。每个开发人员都为该中央存储库的分支配置了一个远程。

我们对该项目遵循同步提交策略,因此每个开发人员必须始终在推送之前将他们的最新工作重新定位在远程分支 HEAD 之上。我想通过禁止将任何合并提交推送到中央存储库来执行此策略。唯一的例外是如果合并是在中央存储库中存在的分支之间。

为简化起见,我不希望开发人员的本地跟踪分支与远程分支合并。而是总是基于远程分支。

我们通过设置 branch.NAME.rebase = true 在开发人员的机器上部分强制执行此操作,这有助于避免开发人员使用 git pull 时出现问题,但是我们需要一个解决方案来在中央存储库端强制执行此操作。

一个非常基本的解决方案是拒绝带有注释的提交:“合并 GITURL 的分支 'NAME'”,但是,更多类似于检查中央存储库的分支路径中是否存在提交的所有父级的东西会更有趣。

建议?解决方案?

编辑:

这是我到目前为止所拥有的:

麻烦的地方是确定任何两个父母的祖先是否来自一个分支。另外,因为在更新任何参考之前调用了 pre-receive 钩子,如果推送包含远程中存在的两个分支的提交,包括这两个分支之间的合并,那么我不知道这里的解决方案是什么。 .

0 投票
7 回答
7628 浏览

git - Git 钩子管理

我们在项目中使用自定义编写的 Git 挂钩。

钩子存储在项目的存储库中,当它们发生变化时,要获得新版本,每个用户必须手动将它们复制到他的 .git/hooks 目录中。这是相当不方便的。

改善这一点的一种方法是使 .git/hooks 成为工作树的符号链接。但这意味着每个分支(甚至是正在开发的用户本地功能分支)都应该具有最新版本的钩子。这也不方便。

你会如何解决这个问题?

0 投票
2 回答
2364 浏览

git - 使用预提交挂钩清理代码

在预提交挂钩期间从我的源文件中清除开发代码是一种好方法吗?

例如,我有调用 xdebug_break() 的代码,并且我想在将代码提交到存储库之前从任何具有该函数的文件中删除对该函数的调用。我宁愿在调用它之前不检查该函数,因为我是唯一一个希望在那里调用该函数的人。

0 投票
3 回答
10553 浏览

python - 仅当测试通过时才在 git 中提交

我最近开始使用 git,也开始了单元测试(使用 Python 的unittest模块)。我想在每次提交时运行我的测试,并且只有在它们通过时才提交。

我猜我需要使用pre-commitin /hooks,并且我已经设法让它运行测试,但是如果测试失败,我似乎无法找到停止提交的方法。我正在运行测试make test,而后者又在运行python3.1 foo.py --test。无论测试通过还是失败,似乎我都没有得到不同的退出条件,但我可能找错了地方。

编辑:这是我想在这里做的不寻常的事情吗?我以为这是一个普遍的要求...

Edit2:以防人们懒得看评论,问题是unittest.TextTestRunner无论测试套件是否成功,它都不会以非零状态退出。为了抓住它,我做了:

0 投票
4 回答
83615 浏览

git - 将 git post-commit 钩子应用于所有当前和未来的存储库

我写了一个 Git 提交后钩子,它工作正常。但是,我想添加这个钩子以应用于我正在处理的所有当前(和未来)Git 存储库。我尝试将钩子添加到我的~/.git/hooks/目录而不是项目目录的钩子目录中,但是,这似乎不起作用。

有没有办法创建将应用于我系统上所有存储库的全局 Git 挂钩(无需将它们复制到每个项目目录中)?如果不是,那么最好的解决方案是什么——也许是 git-init 模板?

0 投票
3 回答
841 浏览

git - 功能齐全的跨平台shebang线是否有破解?

问题:显然 .git/hooks 目录中的脚本取决于与以下之一匹配的文件名:

ETC ...

不需要“文件扩展名”的概念,因为“shebang 行”指示文件应该如何运行,只要它是可执行的并且在您的 Linux 机器上运行。

问题是当您有一些想要在 Windows 机器上运行的脚本时。

问题:有没有办法在Windows机器上执行可以理解的钩子脚本?

0 投票
3 回答
11303 浏览

git - Git post-receive钩子不起作用

我们将 git 与中央仓库一起使用(使用 Gitosis)。我创建了一个 post-receive 挂钩,用于在将更改推送到中央存储库时向开发邮件列表生成一封电子邮件,并从 git 存储库中的文档文件夹生成文档。

因此,在 ~git/ 中,我有一个目录,我们将其称为“a”,其中包含 git 存储库的克隆。接收后挂钩如下所示:

电子邮件脚本正在运行,但文档生成却没有。pull_log.log 的内容是:

这让我认为它没有更改为上述脚本第 5 行中的正确目录。我错了吗?我怎样才能让它工作?

编辑:我已经按照回复中的建议更新了接收后挂钩。脚本现在是:

我从 git push 得到以下输出:

还有什么帮助吗?

哦,如果我自己运行脚本,它就可以工作(我通过说 hooks/post-receive 来运行它)

发现了问题,这要归功于serverfault - 基本上,环境变量GIT_DIRGIT_WORK_TREE钩子运行时设置,这些对 git pull 产生不利影响。取消设置变量可以解决问题。

0 投票
6 回答
8206 浏览

git - 如何在遥控器上挂上 git pull?

当遥控器上发生 git pull 时,有没有办法挂钩(类似于预接收或后接收)。基本上我希望能够让遥控器在拉动时提交它所拥有的任何东西。

在我的情况下,远程上的任何内容都是权威来源,可以在没有 git 提交的情况下进行修改。我想确保当我拉动时,我总是能够获得最新的直播。

0 投票
2 回答
4622 浏览

git - 预推git钩子?

我想在此之前运行一个压缩脚本,git push这样每当用户尝试将更改推送到远程存储库时,它都会检查可压缩资产中未提交的更改,中止git push,运行git commit,然后git push再次运行。

仅使用 git 钩子可以实现类似的事情吗?

0 投票
1 回答
1847 浏览

git - git init 模板,替换修改后的钩子

我不断更新我的本地 git 钩子。我有一个仓库来存放我的 .git 模板。这意味着我一直在运行 git init --template=../git-template 以使用我的钩子更改来更新 repos。

问题:每次我运行 git init --temp... 时,我都需要先删除 .git/hooks 中的钩子,这些钩子将被更新的钩子替换。这很烦人。我知道我可以编写脚本从我想要更新的 repo 中删除这些钩子,但是这个功能是否已经内置在 git 中?