Bash-git-hook在linux上正确运行,但在mac上失败

Bash-git-hook在linux上正确运行,但在mac上失败,bash,git,macos,githooks,Bash,Git,Macos,Githooks,我正在尝试为prepare commit msg编写我的第一个git钩子,我已经将其组合在一起,其行为完全符合我在Fedora box上想要的: #!/usr/bin/bash COMMIT_MSG_FILE=$1 COMMIT_SOURCE=$2 SHA1=$3 TRELLO_ID='XXX' # our trello project id branchName=`git rev-parse --abbrev-ref HEAD` IFS=/ read commitType issueNumbe

我正在尝试为
prepare commit msg
编写我的第一个git钩子,我已经将其组合在一起,其行为完全符合我在Fedora box上想要的:

#!/usr/bin/bash
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
TRELLO_ID='XXX' # our trello project id
branchName=`git rev-parse --abbrev-ref HEAD`
IFS=/ read commitType issueNumber commitDesc <<< $(echo $branchName)
if [[ -z $issueNumber ]]; then
  exit 1
fi
firstLine=$(head -n1 $1)
if [ -z "$firstLine"  ] ;then #Check that this is not an amend by checking that the first line is empty
        sed -i'.bak' -e "1s/^/Issue $issueNumber: \n/" $COMMIT_MSG_FILE
        sed -i'.bak' -e "2a\
                Issue link: https://trello.com/c/$TRELLO_ID/$issueNumber \n" $COMMIT_MSG_FILE
fi
#/usr/bin/bash
提交消息文件=$1
提交源=$2
SHA1=3美元
TRELLO_ID='XXX'#我们的TRELLO项目ID
branchName=`git rev parse--abbrev ref HEAD`

IFS=/read commitType issueNumber commitDesc用sh shebang编写这样的脚本,并用

如果
sh
shebang一切正常,这意味着脚本可以与任何版本的bash、zsh或任何POSIX shell解释器配合使用。MacOS的BSD类型环境可能有不同语法的工具,或者至少缺少GNU CoreUtils特定的功能,因此在运行命令时请小心不要使用这些特定的选项

#/副秘书长/垃圾箱/环境卫生
提交消息文件=“$1”
提交_SOURCE=“$2”
SHA1=“$3”
TRELLO_ID='XXX'#我们的TRELLO项目ID
branchName=$(git版本解析--abbrev ref HEAD)
如果=/
#在/将branchName拆分为参数
#shellcheck disable=SC2086#预期分词
设置--$branchName
commitType=“$1”
issueNumber=“$2”
commitDesc=“$3”
如果[-z“$issueNumber”];然后
出口1
fi
firstLine=$(head-n1“$COMMIT\u MSG\u FILE”)
如果[-z“$firstLine”];然后#通过检查第一行是否为空来检查这不是修正
mv--“$COMMIT_MSG_FILE”$COMMIT_MSG_FILE.bak”&&
sed-e“1s/^/发行$issueNumber:\n/;2a\
问题链接:https://trello.com/c/$TRELLO\u ID/$issueNumber\n“$COMMIT\u MSG\u FILE.bak”>“$COMMIT\u MSG\u FILE”
fi

用sh shebang编写这样的脚本,并用

如果
sh
shebang一切正常,这意味着脚本可以与任何版本的bash、zsh或任何POSIX shell解释器配合使用。MacOS的BSD类型环境可能有不同语法的工具,或者至少缺少GNU CoreUtils特定的功能,因此在运行命令时请小心不要使用这些特定的选项

#/副秘书长/垃圾箱/环境卫生
提交消息文件=“$1”
提交_SOURCE=“$2”
SHA1=“$3”
TRELLO_ID='XXX'#我们的TRELLO项目ID
branchName=$(git版本解析--abbrev ref HEAD)
如果=/
#在/将branchName拆分为参数
#shellcheck disable=SC2086#预期分词
设置--$branchName
commitType=“$1”
issueNumber=“$2”
commitDesc=“$3”
如果[-z“$issueNumber”];然后
出口1
fi
firstLine=$(head-n1“$COMMIT\u MSG\u FILE”)
如果[-z“$firstLine”];然后#通过检查第一行是否为空来检查这不是修正
mv--“$COMMIT_MSG_FILE”$COMMIT_MSG_FILE.bak”&&
sed-e“1s/^/发行$issueNumber:\n/;2a\
问题链接:https://trello.com/c/$TRELLO\u ID/$issueNumber\n“$COMMIT\u MSG\u FILE.bak”>“$COMMIT\u MSG\u FILE”
fi

我在Mac电脑上也遇到过类似的情况,后来意识到我们也有使用windows的人

不确定这是否相关,但是,若您有javascript应用程序,那个么您可以使用不同的方式来创建钩子。除了平台支持之外,这些钩子还可以提交到存储库中,这样就不需要新手手动设置


对于用其他语言实现的解决方案,可能还有其他类似的解决方案。

我在Mac上遇到过类似的情况,然后意识到我们也有使用windows的人

不确定这是否相关,但是,若您有javascript应用程序,那个么您可以使用不同的方式来创建钩子。除了平台支持之外,这些钩子还可以提交到存储库中,这样就不需要新手手动设置


对于用其他语言实现的解决方案,可能还有其他类似的解决方案。

您知道哪一步失败了吗?在这种情况下,“失败”是什么意思?我可能会使用
#/usr/bin/env bash
跨两个平台,但我不确定这是否是你的问题。人们如何在linux和mac之间保持这样的脚本兼容,并提供这么多小的细节?我尝试在普通
/bin/sh
的公共子集中编写我的代码。这意味着在macOS和Linux之间,没有任何sed-i不能以一致的方式工作。在Linux上,该参数必须是
-i
的一部分,在macOS上必须是单独的参数。请尝试使用Perl或Ruby及其
-i
标志。@bk2204
mv--foo-foo.bak&&sed'…'foo.bak>foo
是一种有效的可移植替代
-i
选项不稳定实现的方法。您知道哪一步失败了吗?在这种情况下,“失败”是什么意思?我可能会使用
#/usr/bin/env bash
跨两个平台,但我不确定这是否是你的问题。人们如何在linux和mac之间保持这样的脚本兼容,并提供这么多小的细节?我尝试在普通
/bin/sh
的公共子集中编写我的代码。这意味着在macOS和Linux之间,没有任何sed-i不能以一致的方式工作。在Linux上,该参数必须是
-i
的一部分,在macOS上必须是单独的参数。请尝试使用Perl或Ruby及其
-i
标志。@bk2204
mv--foo-foo.bak&&sed'…'foo.bak>foo
是一种有效的可移植替代
-i
选项不稳定实现的方法。谢谢!那个网站有点像我想要的,以某种方式提交/处理脚本,警告或抱怨不兼容的东西。同样,代码片段也很有用,只是将2a改为1a以匹配我所追求的格式。谢谢!那个网站有点像我想要的,以某种方式提交/处理脚本,警告或抱怨不兼容的东西。这个片段也很好用,只是把2a改成了1a,以匹配我想要的格式。