首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GitKraken忽略服务器端的预接收钩子?

GitKraken忽略服务器端的预接收钩子?
EN

Stack Overflow用户
提问于 2019-10-14 23:48:18
回答 1查看 208关注 0票数 1

GitKraken是否绕过服务器端的预接收钩子?

我有一个要推送到服务器的提交。

然而(出于测试目的),我在服务器上设置了一个简单的pre-receive钩子,它拒绝任何和所有的推送并创建一个文件(作为钩子正在运行的信号):

代码语言:javascript
复制
#!/bin/bash

echo tests > $PWD/../x.txt
exit 1

如果我使用Git Bash (适用于Windows),我的推送显然会被拒绝,但文件x.txt是从服务器存储库创建的:

代码语言:javascript
复制
$ git push
[...]
To server/repo.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'server/repo.git'

但是,如果我通过GitKraken进行推流,推流会通过,并且不会创建x.txt!在服务器上运行git log确认推送成功,因此GitKraken没有说谎。

这怎么可能呢?这些钩子不会显示在relevant GitKraken support page上,但我认为这是因为它们都是本地钩子(pre-commit/rebase等)。我不明白它是怎么让服务器忽略它自己的钩子的……

作为一个可重现的例子,在Git Bash中:

代码语言:javascript
复制
cd /testdir
mkdir repo.git
cd repo.git

git init --bare
# Initialized empty Git repository in /testdir/repo.git/

cat > hooks/pre-receive << EOF
  #!/bin/bash
  echo Nope!
  echo x > ../x.txt
  exit 1
EOF

cd ..
git clone repo.git
# Cloning into 'repo'...
# warning: You appear to have cloned an empty repository.
# done.

cd repo
touch .gitignore
git add .
git commit -m "test"
# [master (root-commit) e9b25d3] test
# Committer: Wasabi <wasabi@email.local>
# Your name and email address were configured [...]
# 1 file changed, 0 insertions(+), 0 deletions(-)
# create mode 100644 .gitignore

git push
# Enumerating objects: 3, done.
# Counting objects: 100% (3/3), done.
# Writing objects: 100% (3/3), 214 bytes | 53.00 KiB/s, done.
# Total 3 (delta 0), reused 0 (delta 0)
# remote: Nope!                          # shows the hook is working
# To testdir/repo.git
#  ! [remote rejected] master -> master (pre-receive hook declined)
# error: failed to push some refs to 'testdir/repo.git'

ls ..
# repo/  repo.git/  x.txt

rm ../x.txt

# Confirming the push really didn't go through
cd ../repo.git
git log
# fatal: your current branch 'master' does not have any commits yet

remote: Nope!x.txt的存在意味着钩子被调用了,而git log表明我们成功地拒绝了推送。

但是,如果我现在在GitKraken中打开repo,我可以简单地点击“推送”,告诉它使用默认的源/主分支,并得到“推送成功:主到源”的通知。

通过Git Bash确认推送确实成功了:

代码语言:javascript
复制
cd ../repo.git
git log
# Author: Wasabi <wasabi@email.local>
# Date:   Mon Oct 14 15:00:49 2019 -0300
# 
#     test
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-23 20:36:43

我在GitKraken's Slack channel and got my answer上问了这个问题

GitKraken实际上并不在幕后使用Git,而是简单地遵循它的协议。

长话短说,如果服务器是远程的,服务器端钩子就可以与GitKraken一起工作(在这种情况下,服务器的Git自然会调用钩子)。但是,由于我的示例(和实际案例)使用本地服务器,因此GitKraken管理整个交互。不幸的是,GitKraken的"Git实现“没有服务器端挂钩。

因此,本地服务器上的GitKraken意味着没有服务器端挂钩。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58380126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档