我需要使用我的Git钩子进行一些指导,以便使用Bash进行预提交

时间:2017-03-27 15:51:09

标签: git bash maven githooks

好的,我试图为我们的项目做的是让开发人员选择是否要提交或编译然后提交他们的代码。这是因为我们有一个代码格式化程序可以清理所有内容,当前部署很多都没有在合并请求之前编译。因此,通过将此文件推送到所有项目,他们将被提醒并且必须选择一个。

目前问题是尝试调用maven版本。我不能做cd ../../直到项目根文件夹。关于如何使这个工作的建议?请不要就为什么决定这个问题进行辩论或讨论,我只需指出如何使其发挥作用。感谢。

echo "CC to Compile and Commit"    "C to just compile"

while true; do
  read choice

  echo "Your choice was " $choice
  if ( "$choice" == CC" ) ; then
    cd ../../
    if [ mvn compile ] ; then
      echo "Compile was okay."
      echo "Continue with git commit."
    fi
  fi
  break
done

3 个答案:

答案 0 :(得分:1)

请使用:

if ( mvn compile ) ; then

[用于在

中运行测试命令

答案 1 :(得分:1)

在bash中创建菜单的好方法是使用select命令,这是一个示例(假设在项目目录中的某处运行):

#! /bin/bash

cmds=("Commit" "Compile and commit")
select cmd in "${cmds[@]}"; do
    pushd "$(git rev-parse --show-toplevel)"
    echo "You picked $cmd, working dir changed to $(pwd)"
    if [[ $cmd == "Compile and commit" ]]; then
        mvn compile
        if [[ $? != "0" ]]; then
            echo "Something went wrong"
        else
            echo "Compilation ok!"
        fi
    fi
    #git commit
    popd
    echo "Done, working dir now $(pwd)"
    break
done

答案 2 :(得分:1)

如果不解决maven问题,或者在预提交挂钩中这是否合理,那么有几点需要考虑:

  • Git挂钩在某个目录中运行。

    钩子的精确当前工作目录各不相同。如果{<1}}在 存储库树中的任何位置运行,则预提交挂钩本身将在Git存储库的顶层运行。无论您在哪个子目录中,都是如此:

    git commit

    请注意,尽管我在文档子目录中,但不是 $ cat .git/hooks/pre-commit #! /bin/sh echo precommit: pwd = $(pwd) exit 1 $ git commit precommit: pwd = [snip]/git $ cd Documentation $ git commit precommit: pwd = [snip]/git

    如果在其他地方运行.../git/Documentation,则当前工作目录可能是存储库的顶层,实际上可能与存储库本身或工作完全无关 - 树:

    git commit

    因此:(1)限制$ cd /tmp $ git --git-dir=$HOME/src/kernel.org/git/.git commit precommit: pwd = /tmp 运行的位置,或(2)完全避免使用当前的工作目录,这一点至关重要。我把它放在粗体中因为以下第三点。但是,如果您愿意,可以将当前工作目录视为工作树:无需尝试从git commit目录中cd ../..

  • Git挂钩的标准输入通常连接到用户的终端 - 假设用户和终端第一名。例如:

    .git/hooks

    虽然您可以尝试打开$ cat .git/hooks/pre-commit #! /bin/sh if [ -t 0 ]; then echo precommit: stdin is a tty else echo precommit: stdin is NOT a tty fi exit 1 $ git commit precommit: stdin is NOT a tty ,但这只有在 <{1}}打开时才有效,因此存在风险。

    < / LI>
  • /dev/tty期间,工作树的内容 将提交的内容。将提交的内容是索引中的内容。如果索引与工作树匹配,则检查工作树正确。您可以使用/dev/tty中的git commit shell函数进行测试,该函数位于require_clean_work_treegit-sh-setup已添加到git --exec-path的前面,所以你可以简单地运行:

    git --exec-path
    例如

    (两个参数是 action 消息时生成的消息)。

那就是说,你发现的另一个问题是:

$PATH

是运行. git-sh-setup require-clean-work-tree "commit" "message to emit if work tree is not clean" 命令的语法,将[ expression ] 作为参数传递。 ([命令也称为expression ]命令;当调用[时,它不要求最终test参数,否则与运行时相同test <expression>。)您希望运行]命令,而不是[mvn命令。