我有一个 done.sh 脚本,每当我完成分支工作时(在将分支发布到远程仓库并将其合并到dev中之后),我会调用该脚本。
目前它只包含以下内容:
git checkout master && git pull
我还希望删除当前分支。
我知道收银台有简写,
git checkout -
允许您转到上一个分支,因此我想要的是git branch -D -
,但不存在。
Stackoverflow研究向我展示了如何获取当前分支的名称:
git rev-parse --abbrev-ref HEAD
但我拥有的脚本意味着我只会在checkout
之后使用此内容,而不是直接使用此内容。
答案 0 :(得分:1)
鉴于您已经包含了-well, -answer,我不确定您的实际问题是什么。也许是关于在脚本中使用变量?
get_current_branch() {
git rev-parse --abbrev-ref HEAD
}
cbranch=$(get_current_branch)
git checkout master && git pull
do_something_with $cbranch
我将get_current_branch
放入shell 函数,因为这个有缺陷:如果你从一个“分离的HEAD”开始,你会得到这个:
$ git checkout --detach master
HEAD is now at 4384e3cde... Git 2.14
Your branch is up-to-date with 'origin/master'.
$ git rev-parse --abbrev-ref HEAD
HEAD
以便$cbranch
结束HEAD
。
替代方法是使用git symbolic-ref
,当您处于此分离的HEAD模式时,它会在stderr上生成fatal: ...
错误消息,并且没有分支名称:
$ git symbolic-ref --short HEAD
fatal: ref HEAD is not a symbolic ref
重新回到master
,但是:
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git symbolic-ref --short HEAD
master
因此,如果shell在处于分离的HEAD模式时应该打印错误,我们可以使用git symbolic-ref
替换shell函数:
cbranch=$(git symbolic-ref --short HEAD) || exit
如果命令失败,|| exit
使shell退出(运行最后一个命令的退出状态,在本例中为git symbolic-ref
状态),因此这将放置当前分支名称进入$cbranch
,或者将消息打印到stderr并退出。
完成所有这些后,我还建议完全避免git pull
, 1 并检查索引和/或工作树是否干净。有关要在Git脚本中使用的一组shell脚本项,请参阅$(git --exec-path)/git-sh-setup
。例如,shell函数require_clean_work_tree
在这里很有用。
1 而不是运行git pull
,您几乎总是想运行git fetch
,然后仔细检查获取的结果。正如git pull
所做的那样,将结果抨击为合并或rebase操作,在脚本中很少是正确的做法。