标签: githooks

绕过预提交钩子进行合并提交

我设置了一些git钩子来gulp在预提交上运行一些命令.我基本上跑jshint/ plato.我基本上想要绕过这两种情况:

  1. 修补程序分支(主/修补程序)
  2. git merge(或者以一种不会在合并提交的情况下崩溃的方式找到一种方法)

plato gulp命令在源上运行分析并生成跟踪复杂性的/ reports /目录.如果我们在修补程序分支上执行此操作,则在将它们合并回开发时会导致合并冲突.这里足够的说话是简单的钩子:

#!/bin/sh

if git diff --cached --name-only --diff-filter=ACM | grep '.js$' >/dev/null 2>&1
then
  git stash -q --keep-index
  ./node_modules/.bin/gulp jshint
  RESULT=$?
  git stash pop -q
  [ $RESULT -ne 0 ] && exit 1
  git stash -q --keep-index
  ./node_modules/.bin/gulp plato
  git add report/
  git stash pop -q
fi

exit 0
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果我在"报告"上有合并冲突,我解决了合并All conflicts fixed but you are still merging.,然后提交它再次运行分析并分阶段提交,当它提交时抛出一个错误:

/Users/Nix/work/project/.git/modules/somesubmodule/MERGE_HEAD'用于阅读:没有这样的文件或目录.

该目录确实存在,但没有合并头...

git git-submodules githooks

13
推荐指数
1
解决办法
3121
查看次数

如何允许git merge commit to master但阻止非合并提交?

我有一个Git预提交钩子,除非被覆盖,否则我无法承诺掌握,以鼓励在分支上进行开发.

但是,我想自动允许合并提交掌握.有没有办法从我的预提交钩子脚本中识别合并提交?该脚本如下所示:

#!/bin/bash

BRANCH=`git branch --color=never| grep '^*'|cut -c3-`

if [ "${BRANCH}D" == "masterD" -a "${GIT_COMMIT_TO_MASTER}D" != "trueD" ]
then
  echo "Commit directly to master is discouraged."
  echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

求助:对于任何寻找剪切和粘贴的人来说,这个钩子脚本的工作版本是:

#!/bin/bash

BRANCH=$(git rev-parse --abbrev-ref HEAD)

if [ "${BRANCH}" == "master" -a "${GIT_COMMIT_TO_MASTER}" != "true" ]
then
  if [ -e "${GIT_DIR}/MERGE_MODE" ]
  then
    echo "Merge to master is allowed."
    exit 0
  else
    echo "Commit directly to …
Run Code Online (Sandbox Code Playgroud)

git githooks

13
推荐指数
1
解决办法
1474
查看次数

Git post-receive hook无效

我们使用带有中央仓库的git(使用Gitosis).我已经创建了一个post-receive挂钩,只要将更改推送到中央存储库,就会生成一封发送到dev邮件列表的电子邮件,并从git repo中的文档文件夹生成文档.

因此,在~git /我有一个目录,我们称之为'a',其中包含git repo的克隆.后接收挂钩看起来像:

#!/bin/bash
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log )
Run Code Online (Sandbox Code Playgroud)

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

fatal: Not a git repository: '.'
Run Code Online (Sandbox Code Playgroud)

这让我觉得它没有改变到上面脚本第5行的正确目录.我错了吗?我怎样才能让它发挥作用?

编辑:我已按照回复中的建议更新了post-receive hook.该脚本现在是:

#!/bin/bash
function die {
  echo "$*" >&2; exit 1
}

function checkgit {
  [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}


cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( set -x
checkgit …
Run Code Online (Sandbox Code Playgroud)

git bash gitosis githooks git-post-receive

12
推荐指数
1
解决办法
1万
查看次数

合并后的git hook - 错误:无法运行

在拉动后触发git钩子我做了一个合并后的钩子.该脚本如下所示:

#!/bin/sh
git log > gitlog.txt
Run Code Online (Sandbox Code Playgroud)

该文件称为"合并后",并且与运行pull命令的文件具有相同的所有者.它也有正确的权限:755.

当你这样我git拉[遥]主人我得到这个错误:

error: cannot run .git/hooks/post-merge: No such file or directory
Run Code Online (Sandbox Code Playgroud)

合并后文件位于.git/hooks文件夹中.

git githooks

12
推荐指数
1
解决办法
5975
查看次数

Bitbucket上的POST钩子

如何在私人Jenkins的bitbucket中使用POST网址?

我一直遇到bitbucket和他们的帖子提交问题.

说明:

http://username:password@myjenkins.instance/job/myproject/build?token=mytoken

我有一个jenkins实例,我想在推送某些存储库时触发.由于jenkins可以从外部(万维网)访问,因此它通过典型的用户/密码系统进行保护.

使用Github时,我可以直接在URL中定义用户名和密码.在检查nginx日志时,很明显github能够转换该URL以登录用户.Bitbucket不是.

以下是一些显示问题的nginx日志.

Bitbucket发布日志:

- - "POST /job/myproject/build?token=mytoken HTTP/1.1" 403 216 "-" "Bitbucket.org"
Run Code Online (Sandbox Code Playgroud)

有趣的是403错误.Acces拒绝了.

Github帖子钩子的相同日志:

- github - "POST /job/myproject/build?token=mytoken HTTP/1.1" 302 0 "-" "-"
Run Code Online (Sandbox Code Playgroud)

如日志所示,github是我创建的用户的名称,具有启动构建的良好权限.

我可以做些什么来启用post hook?

git github nginx bitbucket githooks

12
推荐指数
2
解决办法
5977
查看次数

git - 在裸存储库下检出单个文件

在服务器上,我有裸存储库,它是开发过程的起源,并简化了到QA环境的部署.

所以post-receive它根本

GIT_WORK_TREE=/home/dev git checkout -f
Run Code Online (Sandbox Code Playgroud)

但随着产品变得越来越复杂,还应该发生其他一些事情.所以现在它由deploy.sh脚本处理,脚本也被存储库跟踪.所以我想做的是能够而不是检查整个存储库只是结账deploy.sh并运行它.我认为这样的东西会起作用:

SOURCE_PATH="/home/dev"
GIT_WORK_TREE=$SOURCE_PATH git checkout deploy.sh
$SOURCE_PATH"/deploy.sh"
Run Code Online (Sandbox Code Playgroud)

但它不起作用给出错误:

error: pathspec 'deploy.sh' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者这样做是不可能的?

git sh githooks

12
推荐指数
1
解决办法
4191
查看次数

想要设置一个将已提交文件复制到特定文件夹的挂钩

背景:使用PHP Laravel框架和MySQL为数据库开发Facebook应用程序.

我在我们的开发服务器上设置了Gitlab,并在其上创建了一个存储库,其中添加了团队并提交和推送代码.

我想要做的是,当我将代码推送到GitLab上的特定分支(例如Master)时,我希望它可以在/ var/www/productname中使用,以便我也可以在Facebook画布中测试它(某些事情发生在那里,无法在您的本地机器上测试).

但是,我不希望钩子在每次主控上发生推送时复制所有文件,只需要修改的文件.

任何人都可以帮助这样的钩子吗?

谢谢.

git githooks gitlab

12
推荐指数
2
解决办法
4769
查看次数

如何在git push之后运行bash脚本

我想知道如何在推送到github后在本地仓库中执行bash脚本.

bash脚本位于文件夹的根目录中.它可以根据我猜的调用位置移动.我已经研究过git hooks但是没有后推钩,我不太了解其他钩子.

我试图在推动之后调用jenkins构建.我已经研究过在github上使用post-receive url等推送后通知jenkins的方法,但似乎没有什么对我有用.

这是我正在尝试运行的脚本:

#!/bin/bash/
java -jar jenkins-cli.jar -s http://localhost:8080/ build Test
Run Code Online (Sandbox Code Playgroud)

谢谢!Varun的

git bash hook github githooks

12
推荐指数
1
解决办法
3万
查看次数

防止 git 在 git pull 时覆盖文件所有者

我在这里看到了一些类似的问题,但是给出的解决方案似乎都不起作用...想知道它们是否已经过时,或者这种情况在某种程度上有所不同...所以我想打开一个新线程谈论它。

我遇到了一个令人沮丧的问题,每次执行 和 时git pull,它都会将所有者更改为拉取者的用户。然后发生的情况是该网站显示以下错误:

Warning: file_get_contents(/var/www/html/wp-content/themes/<my-theme>/resources/views/<changed-file>): failed to open stream: Permission denied in /var/www/html/wp-includes/class-wp-theme.php on line 1207

这只能通过运行chown www-data更改的文件来修复。

当更多的人开始在网站上工作时,或者当重要文件发生更改(默认模板/页眉/页脚..)时,这将成为一个问题,并且网站将变为空白,直到运行 chown。


网站详情

Laravel、wordpress、ubuntu 18、armor 托管

Git 存储库存储在自定义主题中


我尝试了一些解决方案,但似乎都不起作用,(也许是因为它们实施不正确......)

我尝试过的解决方案

1:将文件模式设置为 false - 我在本地计算机和相关服务器上将文件模式本地和全局设置为 false。我也尝试过将大小写更改为“fileMode”。

2:实现更新后挂钩 - 我添加了一个更新后挂钩来自动更新文件权限/所有权。这是脚本(请注意,git 存储库位于自定义主题中):

#!/bin/sh

# default owner user
OWNER="www-data:www-data"

# changed file permission
PERMISSION="664"

# web repository directory
REPO_DIR="/var/www/html/wp-content/themes/quorum-theme"

# remote repository 
REMOTE_REPO="origin"

# public branch of the remote repository
REMOTE_REPO_BRANCH="master"

cd $REPO_DIR || exit
unset GIT_DIR
files="$(git diff-tree -r …
Run Code Online (Sandbox Code Playgroud)

git git-pull githooks laravel file-ownership

12
推荐指数
1
解决办法
3880
查看次数

编写拒绝无效子模块提交的git update hook的最佳方法是什么?

我正在尝试update为git 编写一个钩子,如果子模块被更新为子模块的上游存储库中不存在的提交ID,则会跳转.换句话说,我想强制用户在将更改推送到子模块指针之前将更改推送到子模块存储库.

一个警告:

  • 我只想测试其子上游存储库与父存储库位于同一服务器上的子模块.否则我们开始做一些疯狂的事情,比如在git hook中调用'git clone'或'git fetch',这不会很有趣.

我一直在玩一个想法,但感觉必须有一个更好的方法来做到这一点.这是我计划在更新钩子中做的事情:

  1. 检查传递给钩子的refname,看看我们是否正在更新refs/heads/.如果没有,请尽早退出.
  2. 使用git rev-list得到被推版本列表.
  3. 对于每个修订:
    1. 调用git show <revision_id>并使用一个正则表达式,查看子模块是否已更新(通过搜索`+子项目提交[0-9a-f] +).
    2. 如果此提交确实更改了子模块,请获取该.gitmodules特定commit(git show <revision_id>:.gitmodules)所看到的文件内容.
    3. 使用3.1和3.2的结果获取子模块URL及其更新的提交ID列表.
    4. 检查3.3中创建的列表,对应于将子模块URL映射到文件系统上的本地裸git存储库的外部文件.
    5. cd到3.4中找到的路径并执行git rev-parse --quiet --verify <updated_submodule_commit_id>以查看该存储库中是否存在该提交.如果没有,则以非零状态退出.

(注意:我相信3.2的结果可能会在修订版本中缓存,只要输出git rev-parse --quiet --verify <revision_id>:.gitmodules不会从一个修订版更改为下一个修订版.我将此部分留下来以简化解决方案.)

所以是的,这看起来相当复杂,我不禁想知道是否有一些内部git命令可能会让我的生活变得更轻松.或者也许有不同的方式来思考这个问题?

git hook git-submodules githooks

11
推荐指数
1
解决办法
1698
查看次数