Git - Bare repo不能拥有主分支的工作树 - 为什么?

时间:2016-10-05 20:20:20

标签: git version-control merge git-bare git-worktree

我正在开发一些服务器端软件来进行合并。通过使用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的修复。

2 个答案:

答案 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,以便主机不会被检出