起因
某个项目是通过构建生产版本内容至git仓库的release分支来实现交付工作。
我对于此类交付情况,一般会在本地项目创建名为releases/的目录。在使用脚本将构建内容生产到releases目录后,通过手动提交推送代码来完成整个交付过程。
在使用脚本来完成提交推送生产内容时,遇到下面错误:
✔ npm run build
✔ cd releases/
✔ git add .
✖ git commit -m '更新版本至1.12.0-rc.1'
ERROR On branch master
Your branch is up to date with 'origin/master'.
上面是release-it完成发版后的后续脚本执行结果,下面是具体执行脚本:
"hooks":{
"after:release":[
"npm run build",
"cd releases/",
"git commit -am '更新版本至${version}'",
"git push","cd .."
]
},
分析
结合release-it来看,很显然是git的工作目录依然停留在项目根。cd releases/命令并没有改变git的执行目录,所以导致提交命令出错。
解决办法
要改善这个问题,需要改变git的工作目录。需要同时设置--git-dir和--work-tree对应目录。当然也可选择使用GIT_DIR和GIT_WORK_TREE两个全局变量来控制,具体看你的情况来使用。
使用例子如下:
# 例子
# 前提:初次化两个本地目录
$ mkdir git
$ git init git/test/
$ echo -n foo > git/test/foo.txt
$ mkdir work
$ git init work/test
$ echo -n foo > work/test/foo.txt
# 命令行依旧在当前目录下,提交不同目录中的文件
## 使用参数的情况
$ git --git-dir git/test/.git --work-tree git/test commit status
$ git --git-dir git/test/.git --work-tree git/test commit -am "commit 1"
$ git --git-dir work/test/.git --work-tree work/test commit status
$ git --git-dir work/test/.git --work-tree work/test commit -am "commit 1"
## 使用全局变量的情况
$ GIT_DIR=git/test/.git && GIT_WORK_TREE=git/test
$ git commit status
$ git -am "commit 1"
$ GIT_DIR=work/test/.git && GIT_WORK_TREE=work/test
$ git commit status
$ git -am "commit 1"
需要注意的是,--git-dir和--work-tree两个变量需要同时设置,才能改变操作的具体目录及git历史。