繁体   English   中英

为什么Git允许推送到添加的工作树中的已签出分支? 我应该如何恢复?

[英]Why does Git allow pushing to a checked-out branch in an added worktree? How shall I recover?

Git通常拒绝推送到普通的非--bare存储库的(单个)当前已检出的分支:

 $ git push upstream master Counting objects: 1, done. Writing objects: 100% (1/1), 188 bytes | 0 bytes/s, done. Total 1 (delta 0), reused 0 (delta 0) remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because ... 

这是正确的行为。 请参阅Git推送错误“ [[远程拒绝] master-> master(当前已签出分支)”)

但是,在同一上游,我添加了一个工作树,并签出了另一个分支。 在上面的错误演示之前,我运行了:

$ git push upstream pytest

它成功了 ,显然它不应该这样做,因为同样的原因, master在这里失败了。 特别是, receive.denyCurrentBranch实际上设置为拒绝当前分支。

在该上游系统上, git worktree list

$ git worktree list
<path1>     9febb4c [master]
<path2>     406bef8 [pytest]

这表明至少有一部分 Git知道它已经签出。 但是,无论如何,它还是允许推送,这导致了两个问题:

  1. 这是错误吗?

  2. 现在我陷入了混乱,如何恢复?

(旁注:在使用辅助工作树时,我偶然偶然发现了这一点,因此我将其记录为后代。因此,我将发布自己的答案。)

  1. 是的,(显然)是一个错误:在接收包代码中,Git的“这是当前分支”测试正在使用pre-multiple-work-trees测试,该测试只是检查主工作树的HEAD 需要修改它以检查所有工作树,就像git worktree list一样。

    (我正在通过VPN连接的两个系统上工作,目前其中只有一个系统正在运行服务器,因此我在这里使用了非对称获取/推送模型。)

  2. 幸运的是,我没有未完成的工作,因此恢复很简单:在辅助工作树中(在pytest分支pytest ),只需运行:

     git reset --hard HEAD 

    这将同时清理索引和工作树。

    但是,如果我不是,最简单的技巧就是强制在该分支的先前值处存在一个新分支,然后检查该分支。 这可以一步完成:

     git checkout -b tempbranch pytest@{1} 

    现在,工作树将位于不同的(pre- push )分支上,在该分支中,现在可以落实或隐藏或重新设置临时工作,或采用其他任何方式,并以通常的方式进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM