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

Bash git-hook runs correctly on linux but fails on mac

我正在尝试为 prepare-commit-msg 编写我的第一个 git 钩子,我把它放在一起,它在我的 Fedora 盒子上的表现完全符合我的要求:

#!/usr/bin/bash
COMMIT_MSG_FILE=
COMMIT_SOURCE=
SHA1=
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 )
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

我已经与一位 运行 正在 mac 的团队成员分享了这个,但一直失败。关于 mac 设置的额外信息是它是 运行ning zsh 但我不知道这是否相关。我不熟悉 macs,所以当 运行ning git commit 时,我无法帮助其他人在这个文件中回应很多。作为记录,我也没有 bash.

的经验

起初我认为这是 sed 兼容性的问题,因为我在这里发现的其他问题都围绕着它,但经过进一步测试后,似乎这在拆分分支名称时已经失败了(我们使用的是约定<type>/<ticket-number>/<desc>)。我还注意到在文件周围使用单引号和双引号的语法很重要。

最后一个好奇心,在他的 mac 上,如果我们 运行 $ which bash 在他的终端上得到 /bin/bash,这是否意味着 shebang 也是错误的?人们如何让这样的脚本在 linux 和 mac 之间兼容,并包含这么多小细节?我还考虑过在 python 上重写它,这可以带来更容易的兼容性,但我真的很想了解使它在两个系统上工作需要什么。

谢谢!

用 sh shebang 编写这样的脚本并用 https://www.shellcheck.net/

检查

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

#!/usr/bin/env sh

COMMIT_MSG_FILE=""
COMMIT_SOURCE=""
SHA1=""
TRELLO_ID='XXX' # our trello project id
branchName=$(git rev-parse --abbrev-ref HEAD)
IFS=/
# Split branchName at / into arguments
# shellcheck disable=SC2086 # intended word splitting
set -- $branchName
commitType=""
issueNumber=""
commitDesc=""
if [ -z "$issueNumber" ]; then
  exit 1
fi
firstLine=$(head -n1 "$COMMIT_MSG_FILE")
if [ -z "$firstLine"  ] ;then #Check that this is not an amend by checking that the first line is empty
        mv -- "$COMMIT_MSG_FILE" "$COMMIT_MSG_FILE.bak" &&
        sed -e "1s/^/Issue $issueNumber: \n/;2a\
                Issue link: https://trello.com/c/$TRELLO_ID/$issueNumber \n" "$COMMIT_MSG_FILE.bak" >"$COMMIT_MSG_FILE"
fi

我遇到过与 Mac 非常相似的情况,然后意识到我们也有 windows 的人。

不确定是否相关,但是,如果您有 javascript 应用程序,那么您可以使用 https://github.com/typicode/husky 以稍微不同的方式制作挂钩。除了平台支持之外,此类挂钩可能会提交到存储库中,从而消除了新手手动设置的需要。

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