起因
某个项目是通过构建生产版本内容至git仓库的release分支来实现交付工作。
我对于此类交付情况,一般会在本地项目创建名为releases/
的目录。在使用脚本将构建内容生产到releases
目录后,通过手动提交推送代码来完成整个交付过程。
在使用脚本来完成提交推送生产内容时,遇到下面错误:
1 2 3 4 5 6
| ✔ 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完成发版后的后续脚本执行结果,下面是具体执行脚本:
1 2 3 4 5 6 7 8
| "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
两个全局变量来控制,具体看你的情况来使用。
使用例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
$ 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历史。
引用