首页 > 解决方案 > git:如何在预接收挂钩中 grep 接收到的文件

问题描述

我在本地存储库中创建了以下预推送脚本,.git/hooks/以禁止将具有未解决的 git 冲突的文件推送到服务器:

#!/bin/bash
top_dir=$(git rev-parse --show-toplevel)
conflicts=$(grep -r -n -s --include=\*.{pm,pl,mc,mi,js,css} "<<<<<<< HEAD" "$top_dir")

if [ "$conflicts" = "" ]; then
    exit 0
else
    printf "Unresolved git conflict found, commit rejected.\n\n"
    echo "$conflicts"
    exit 1
fi

有用。但是我们如何拒绝所有在服务器端存在未解决冲突的提交pre-receive呢?在这里我知道top_dir- 目录,在哪里 grep。但是在服务器上没有保存的文件。我需要在客户发送给我的文件中进行 grep。

怎么做?

标签: git

解决方案


作为“钩子无法读取提交的文件以推送到远程”中的torek文档:pre-receivemaster

预接收挂钩通常更难编写,因为您必须处理许多情况:

  • 多次提交
  • 不是分支(标签)的引用
  • 不是提交的对象(带注释的标签)
  • 分支创建和删除以及更新

这种钩子适用于提交消息
话虽如此,您可以在此处看到一个示例,在名义情况下:

# <oldrev> <newrev> <refname>
while  read oldrev newrev ref ;
do
    list = $ ( git show --pretty = " format: " --name-only $ {newrev}  | grep -e ' .php ' -e ' .phtml ' )
    for  file  in  $ {list} ;  do
        git show $ {newrev} : $ {file}  >  $ TMP_FILE
        OUTPUT = $ ( $ PHPCS_BIN -s --standard = $ PHPCS_CODING_STANDARD  $ TMP_FILE )
        ...

推荐阅读