我正在开发一些服务器端软件来进行合并。通过使用git worktree
,可以检查给定分支的裸仓库并将另一个分支合并到其中。即使有大型存储库,它也非常快。
唯一的例外似乎是与master
合并。当我git worktree add /tmp/path/to/worktree master
时,我收到错误:
致命:'master'已在'/ path / to / bare / repo'
签出
但显然不是这样,git worktree list
给出了:
/ path / to / bare / repo(bare)
...当然,那条路上没有工作树,只有你期望的裸仓库文件。
更新:我与git维护者取得联系,他们同意这可能是一个错误。我有一个初步补丁来测试。此外,我还能够在没有补丁的情况下重现所需的行为。
此时我并不完全确定边界条件或根本原因是什么,并且可能会有来自git的修复。
答案 0 :(得分:8)
原来这是git中的一个错误,从2.5及更高版本的worktree实现开始。
裸存储库仍然有一个HEAD reflink。 git(最多包括2.10)认为该链接指向的是新克隆者的默认分支,并且(错误地)将其视为活动工作树上的。
我收到了来自git维护者的补丁来修复此行为,它似乎有效。或者,应该可以在裸仓库上使用update-ref暂时从主服务器切换。
我将测试这两个选项。
答案 1 :(得分:3)
我认为这是不正确的。您可能想要向他们报告。我还没有找到任何讨论,虽然情况似乎很明显。
作为一种解决方法,您可以运行# credits go to Oliver Kiddle <opk@zsh.org>,
# who personally shared these upper/lower widgets.
# I just corrected a small bug.
vi-lowercase() {
local save_cut="$CUTBUFFER"
local save_cur="$CURSOR"
zle .vi-change || return
zle .vi-cmd-mode
CUTBUFFER="${CUTBUFFER:l}"
if [[ $CURSOR = '0' ]]; then
zle .vi-put-before -n 1
else
zle .vi-put-after -n 1
fi
CUTBUFFER="$save_cut"
CURSOR="$save_cur"
}
vi-uppercase() {
local save_cut="$CUTBUFFER"
local save_cur="$CURSOR"
zle .vi-change || return
zle .vi-cmd-mode
CUTBUFFER="${CUTBUFFER:u}"
if [[ $CURSOR = '0' ]]; then
zle .vi-put-before -n 1
else
zle .vi-put-after -n 1
fi
CUTBUFFER="$save_cut"
CURSOR="$save_cur"
}
# can safely disable this after commit zsh commit #a73ae70 (zsh-5.2-301- ga73ae70)
zle -N vi-lowercase
zle -N vi-uppercase
bindkey -a 'gU' vi-uppercase
bindkey -a 'gu' vi-lowercase
bindkey -M visual 'u' vi-lowercase
bindkey -M visual 'U' vi-uppercase
。它会分离当前的HEAD,以便主机不会被检出