GitKraken 忽略服务器端预接收挂钩?
GitKraken ignoring server-side pre-receive hooks?
GitKraken 是否绕过服务器端预接收挂钩?
我有一个要推送到服务器的提交。
但是(出于测试目的),我在服务器上设置了一个简单的 pre-receive
挂钩,它拒绝任何和所有推送并创建一个文件(作为挂钩 运行 的信号):
#!/bin/bash
echo tests > $PWD/../x.txt
exit 1
如果我使用 Git Bash(对于 Windows),我的推送显然会被拒绝,但是文件 x.txt
是从服务器回购中创建的:
$ 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:
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
,我只需单击 "Push",告诉它使用默认的 origin/master 分支,然后获取通知 "Push Successful: master to origin".
确认推送确实完成 Git Bash:
cd ../repo.git
git log
# Author: Wasabi <wasabi@email.local>
# Date: Mon Oct 14 15:00:49 2019 -0300
#
# test
我在 GitKraken's Slack channel and got my answer 上问了这个问题:
GitKraken 实际上并没有在幕后使用 Git,只是遵循它的协议。
长话短说,如果服务器是远程的,服务器端挂钩将与 GitKraken 一起工作(在这种情况下,服务器的 Git 自然会调用挂钩)。但是,由于我的示例(和真实案例)使用本地服务器,因此 GitKraken 管理整个交互。不幸的是,GitKraken 的 "Git implementation" 没有服务器端挂钩。
因此,Git本地服务器上的 Kraken 意味着没有服务器端挂钩。
GitKraken 是否绕过服务器端预接收挂钩?
我有一个要推送到服务器的提交。
但是(出于测试目的),我在服务器上设置了一个简单的 pre-receive
挂钩,它拒绝任何和所有推送并创建一个文件(作为挂钩 运行 的信号):
#!/bin/bash
echo tests > $PWD/../x.txt
exit 1
如果我使用 Git Bash(对于 Windows),我的推送显然会被拒绝,但是文件 x.txt
是从服务器回购中创建的:
$ 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:
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
,我只需单击 "Push",告诉它使用默认的 origin/master 分支,然后获取通知 "Push Successful: master to origin".
确认推送确实完成 Git Bash:
cd ../repo.git
git log
# Author: Wasabi <wasabi@email.local>
# Date: Mon Oct 14 15:00:49 2019 -0300
#
# test
我在 GitKraken's Slack channel and got my answer 上问了这个问题:
GitKraken 实际上并没有在幕后使用 Git,只是遵循它的协议。
长话短说,如果服务器是远程的,服务器端挂钩将与 GitKraken 一起工作(在这种情况下,服务器的 Git 自然会调用挂钩)。但是,由于我的示例(和真实案例)使用本地服务器,因此 GitKraken 管理整个交互。不幸的是,GitKraken 的 "Git implementation" 没有服务器端挂钩。
因此,Git本地服务器上的 Kraken 意味着没有服务器端挂钩。