鉴于您已经包含了-嗯,一个-答案,我不确定您的实际问题是什么。也许是关于在脚本中使用变量?
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
所以我们可以用git symbolic-ref替换shell函数,如果shell在分离HEAD模式下应该打印错误:
cbranch=$(git symbolic-ref --short HEAD) || exit
如果命令失败,|| exit 使 shell 退出(最后一个命令运行的退出状态,在本例中为 git symbolic-ref 状态),因此这会将当前分支名称放入 $cbranch , 或者打印一条消息到 stderr 并退出。
除此之外,我还建议完全避免git pull,1 并检查索引和/或工作树是否干净。请参阅$(git --exec-path)/git-sh-setup 以了解在 Git 脚本中使用的一系列 shell 脚本项。例如,shell 函数 require_clean_work_tree 在这里很有用。
1您几乎总是希望运行git fetch,然后仔细检查提取结果,而不是运行git pull。像git pull 所做的那样,仅仅将结果放入合并或变基操作中,在脚本中很少做正确的事情。