gpt4 book ai didi

git - 由于解析器错误,将更复杂的脚本添加为 Git 别名不起作用

转载 作者:行者123 更新时间:2023-12-04 18:36:01 24 4
gpt4 key购买 nike

在 Git 中,为了方便起见,我想添加一些全局别名。

命令

git config --global alias.unstage 'reset HEAD --'

如文档中所述,工作正常。所以我尝试使用相同的语法,使用 !附加到命令之前,以运行外部更复杂的脚本:

# release-major
latest=$(git describe --abbrev=0 --tags 2>/dev/null); latest=${latest:-v0.0.0}; components=(${latest//./ }); major=${components[0]}; major=${major//v/}; minor=${components[1]}; patch=${components[2]}; major=$((major+1)); minor=0; patch=0; next='v'$major'.'$minor'.'$patch; git tag -a $next -m ""

# release-minor
latest=$(git describe --abbrev=0 --tags 2>/dev/null); latest=${latest:-v0.0.0}; components=(${latest//./ }); major=${components[0]}; major=${major//v/}; minor=${components[1]}; patch=${components[2]}; minor=$((minor+1)); patch=0; next='v'$major'.'$minor'.'$patch; git tag -a $next -m ""

# release-patch
latest=$(git describe --abbrev=0 --tags 2>/dev/null); latest=${latest:-v0.0.0}; components=(${latest//./ }); major=${components[0]}; major=${major//v/}; minor=${components[1]}; patch=${components[2]}; patch=$((patch+1)); next='v'$major'.'$minor'.'$patch; git tag -a $next -m ""

如果我尝试使用语法添加这三个脚本

git config --global alias.my-alias-name '!my-alias-code'

但是,它不起作用。结果始终是解析器错误。

我尝试了我能想象到的所有引用、取消引用、单引号和双引号的变体。我什至尝试将这些添加到 .gitconfig直接存档。这些都不起作用。

我错过了什么?如何修复这些脚本以便我可以将它们添加为别名?

最佳答案

您可以对单行脚本进行反bash 化。让我们看一下这个例子:

latest=$(git describe --abbrev=0 --tags 2>/dev/null)
latest=${latest:-v0.0.0}
components=(${latest//./ })

这是您的第一个 bash 主义:您正在从值中创建一个数组,用空格替换点(然后分解)。普通 shell 没有数组;相反,我们使用位置参数,将它们分解为 $IFS , 使用 set .为了保持干净,我们需要在函数中使用它(每个函数都有自己的私有(private)位置),但是如果所有位置参数都已经被捕获到局部变量中,我们可以覆盖它们:
set -- $(echo $latest | sed "s/\./ /g")

(回到你的代码)
major=${components[0]}
major=${major//v/}
minor=${components[1]}
patch=${components[2]}

现在我们将在这里使用 $1、$2 和 $3。我们不妨移动 v替换到上面的 sed 中(POSIX sh 可以做这个替换,但我说让 sed 做它,因为它更明显和/或更有效):
set -- $(echo $latest | sed -e s/v// -e "s/\./ /g")
major=$1
minor=$2
patch=$3

回到你原来的代码:
major=$((major+1))
minor=0
patch=0
next='v'$major'.'$minor'.'$patch
git tag -a $next -m ""

这都是有效的 POSIX sh,所以我们完成了这个转换。

关于git - 由于解析器错误,将更复杂的脚本添加为 Git 别名不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com