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 以稍微不同的方式制作挂钩。除了平台支持之外,此类挂钩可能会提交到存储库中,从而消除了新手手动设置的需要。
用其他语言实现的解决方案可能还有其他类似的解决方案。
我正在尝试为 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 以稍微不同的方式制作挂钩。除了平台支持之外,此类挂钩可能会提交到存储库中,从而消除了新手手动设置的需要。
用其他语言实现的解决方案可能还有其他类似的解决方案。