分享我的发现、想法与心得

0%

在脚本中更改git执行目录

起因

某个项目是通过构建生产版本内容至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_DIRGIT_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历史。

引用