好的,我试图为我们的项目做的是让开发人员选择是否要提交或编译然后提交他们的代码。这是因为我们有一个代码格式化程序可以清理所有内容,当前部署很多都没有在合并请求之前编译。因此,通过将此文件推送到所有项目,他们将被提醒并且必须选择一个。
目前问题是尝试调用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
答案 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}}打开时才有效,因此存在风险。
在/dev/tty
期间,工作树的内容 不将提交的内容。将提交的内容是索引中的内容。如果索引与工作树匹配,则检查工作树仅正确。您可以使用/dev/tty
中的git commit
shell函数进行测试,该函数位于require_clean_work_tree
,git-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
命令。