在子模块进行一些更改之后,我制作了以下bash脚本来提交父仓库。 脚本想要通过cd ..检查父仓库当前分支的全部内容,但是问题是cd ..不会影响即将到来的命令,因为我猜这是subshell
我试图跑步 每个命令前1 cd ../ && 2-做别名,但没有成功 3-运行exec,但脚本未继续
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "post-commit".
commit_msg= git log -1 --pretty=%B
if [[ $(git branch | grep \* | cut -d ' ' -f2) == "int1177/next" ]]; then
cd ..
if [[ $(git branch | grep \* | cut -d ' ' -f2) == "B0/next" ]]; then
git add 6_Tests
git commit -m "bs esss"
echo "development branch B0/next has now new commit"
else
echo "development branch isn't B0/next"
fi
else
echo "current branch isn't int1177/next"
fi
答案 0 :(得分:4)
实际上,这个特殊问题不是bash问题,而是Git问题。
Why doesn't "cd" work in a shell script?通常是有效的,并且是许多 other 问题的合适答案。但是,这个特定的post-commit
钩子试图将chdir
从子模块中移出到其父超级项目中,然后在父超级项目中进行提交。 是可能的。出于其他原因,这可能不是一个好主意-通常,即使在其他存储库 1 中,让Git commit钩子创建提交也是不明智的-但在这种情况下,您会遇到Git < em>通过环境变量查找其目录。
特别是,有一个环境变量GIT_DIR
告诉Git:包含存储库的.git
目录位于此路径上。当Git运行Git钩子时,Git通常将$GIT_DIR
设置为.
或.git
。如果未设置$GIT_DIR
,则Git将通过目录树搜索找到.git
目录,但是如果$GIT_DIR
设置,Git假设正确设置了$GIT_DIR
。。
解决方案是取消设置 GIT_DIR
:
unset GIT_DIR
cd ..
其余的sub-shell命令将在一步式目录中运行,并且现在$GIT_DIR
不再设置,Git将在超级项目的工作树中搜索.git
。超级项目的目录。
顺便说一句,
$(git branch | grep \* | cut -d ' ' -f2)
是一种获取当前分支名称的笨拙方法。使用:
git rev-parse --abbrev-ref HEAD
相反,在这里。 (另一种选择是git symbolic-ref --short HEAD
,但是由于HEAD分离而导致失败,而您可能希望静默结果只是HEAD
方法产生的单词rev-parse
。)< / p>
1 在这种情况下的主要危险在于,超级项目存储库不一定具有任何形式来立即处理提交。 编辑:或在this comment中发现的 甚至没有设置为该子模块的超级项目,但更不用说更新子模块了提交已添加。