为什么variable=$(cd any/path && git <any command>)在git hook中不起作用?

问题描述 投票:0回答:1

我正在尝试将预提交挂钩中提交的源代码格式化为,但我只想在特定存储库中时执行此挂钩。我检查我是否在此存储库中的“聪明”方法是检查我的存储库的遥控器中是否有子字符串。到现在为止一切都很好。

但是,我的特殊存储库需要格式化,具有子模块,因此当我从子模块的上下文中提交某些内容时,我还希望能够检查超级存储库的遥控器。我的解决方案如下:

test=$(cd ../../; git remote -vv | grep 'my_special_repo')
echo $test
if [[ $test == *"my_special_repo"* ]]; then
    echo "This is a my_special_repo child submodule"
    echo "Commit should be formatted"
else
    exit 0
fi

这是行不通的。当我

echo $test
时它是空的。

但是这个:

test=$(cd ../../; echo $PWD; git remote -vv | grep 'my_special_repo')
echo $test
if [[ $test == *"my_special_repo"* ]]; then
    echo "This is a my_special_repo child submodule"
    echo "Commit should be formatted"
else
    exit 0
fi

工作正常。

我发现这个事实,

cd any/path && git any-command
在其他问题中的钩子或相关问题/答案中的评论中不起作用,但没有解释。

  1. 为什么这不起作用?
  2. 为什么我的解决方法有效?

PS:我的git版本是2.41.0.windows.1

git git-bash githooks
1个回答
0
投票

正如phd他的评论中所说,缺少的是:

unset $(git rev-parse --local-env-vars)

之前

test=$(cd ../../; git remote -vv | grep 'my_special_repo')

这样 GIT_DIR 等环境变量就会被重置,因此钩子的脚本可以按预期工作。 这是基于这个答案

PS:现在它可以工作了,我将我的脚本修改为更合适的形式(在我看来):

test=$(git -C ../../ remote -vv | grep 'my_special_repo')
© www.soinside.com 2019 - 2024. All rights reserved.