背景:我希望有post-rewrite
钩子,它会自动将更改推送到上游仓库(我是它的唯一用户,我用它在不同的机器之间共享我自己的工作)。重写后是我必须使用强制推送的唯一时间,所以我希望它是这样的:
currentBranch=...
git push [origin] $currentBranch -f
在其他问题中,建议您使用git rev-parse --abbrev-ref HEAD
或git 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
答案 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
标记,则重写后的脚本根本不会运行。在我看来,$(git --exec-path)/git-am
需要将笔记调整和重写后挂钩添加到git-rebase--am
脚本。
在修复错误之前,一种解决方法是使用交互式rebase(您可以将环境变量GIT_SEQUENCE_EDITOR
设置为:
或true
,以使其在没有编辑会话的情况下运行。