如何在post-rewrite hook中确定当前分支

时间:2015-10-23 17:59:24

标签: git git-branch githooks

背景:我希望有post-rewrite钩子,它会自动将更改推送到上游仓库(我是它的唯一用户,我用它在不同的机器之间共享我自己的工作)。重写后是我必须使用强制推送的唯一时间,所以我希望它是这样的:

currentBranch=...
git push [origin] $currentBranch -f

在其他问题中,建议您使用git rev-parse --abbrev-ref HEADgit symbolic-ref --short HEAD。这些都在post-rewrite脚本之外使用时正确确定当前分支,但不在其内部。如果我将post-rewrite脚本设置为:

#!/bin/bash
git rev-parse --abbrev-ref HEAD
git symbolic-ref --short HEAD

控制台输出将是:

$ git rebase [...]
First, rewinding head to replay your work on top of it...
Applying: [...]
HEAD
fatal: ref HEAD is not a symbolic ref
$ git rev-parse --abbrev-ref HEAD
myBranch
$ git symbolic-ref --short HEAD
myBranch

编辑:

复制我的问题的简短脚本:

# setup the repo
git init test
cd test
echo "git rev-parse --abbrev-ref HEAD" >> .git/hooks/post-rewrite
echo "git symbolic-ref --short HEAD" >> .git/hooks/post-rewrite
chmod a+x .git/hooks/post-rewrite

# create the root branch
git checkout -b root
touch test
git add test
git commit -m "test commit for root" test

# branch out
git checkout -b test1
touch test1
git add test1
git commit -m "test commit 1" test1

# branch out again
git checkout -b test2 root
touch test2
git add test2
git commit -m "test commit 2" test2

# rebase
git rebase test1
git rev-parse --abbrev-ref HEAD
git symbolic-ref --short HEAD

预期输出将是(在删除以前的消息之后):

First, rewinding head to replay your work on top of it...
Applying: test commit 2
test2
test2
test2
test2

相反,我得到了

First, rewinding head to replay your work on top of it...
Applying: test commit 2
HEAD
fatal: ref HEAD is not a symbolic ref
test2
test2

1 个答案:

答案 0 :(得分:1)

在Filip Wolski的其他信息(编辑和评论)和手动调查之间,我现在相信这是git中的一个错误。

当您调用非交互式rebase时,git运行其git-rebase--am脚本(在git --exec-path目录之外),该脚本与当前分支分离并使用git am ... --rebasing ...应用补丁(由git format-patch产生的各种旗帜。)

这里有一个例外:如果你使用keep-empty-commits标志,脚本使用git cherry-pick来复制提交,包括空提交。

在任何情况下,在git-rebase--am的末尾,脚本都会返回分支并调整分支标签。但是,这是在git am脚本完成并返回之后。它是调用重写后挂钩的git am脚本,并且在#34;当前分支"之前发生太快。概念已经恢复。

这似乎会导致两个错误:

  • 如果您使用-k--keep-empty标记,则重写后的脚本根本不会运行。
  • 否则你遇到了这种情况,其中post-rewrite hook运行,但处于detached-HEAD状态。

在我看来,$(git --exec-path)/git-am需要将笔记调整和重写后挂钩添加到git-rebase--am脚本。

在修复错误之前,一种解决方法是使用交互式rebase(您可以将环境变量GIT_SEQUENCE_EDITOR设置为:true,以使其在没有编辑会话的情况下运行。