Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么git总是通过强制更新来重新创建分支?_Git_Github - Fatal编程技术网

为什么git总是通过强制更新来重新创建分支?

为什么git总是通过强制更新来重新创建分支?,git,github,Git,Github,每当我做一个fetch时,我都会收到Git的通知,说它已经收到了一个强制更新,它说一个分支是新的。每次抓取都是这样。我想知道为什么会发生这种情况,以及如何防止它发生(意思是修复它)。我试过rm.git/refs/remotes/MWNG,但没有效果 $ git fetch MWNG From github.com:MWNG/multikanal.epi7.mysite + 022873b...ecaa5df Feature/2005-registrering-sunnhetsbonus -&g

每当我做一个fetch时,我都会收到Git的通知,说它已经收到了一个强制更新,它说一个分支是新的。每次抓取都是这样。我想知道为什么会发生这种情况,以及如何防止它发生(意思是修复它)。我试过
rm.git/refs/remotes/MWNG
,但没有效果

$ git fetch MWNG
From github.com:MWNG/multikanal.epi7.mysite
 + 022873b...ecaa5df Feature/2005-registrering-sunnhetsbonus -> MWNG/Feature/2005-registrering-sunnhetsbonus  (forced update)
 * [new branch]      feature/2005-registrering-sunnhetsbonus -> MWNG/feature/2005-registrering-sunnhetsbonus
 * [new branch]      feature/azure-rest-api -> MWNG/feature/azure-rest-api

$ git fetch MWNG
From github.com:MWNG/multikanal.epi7.mysite
 + 022873b...ecaa5df Feature/2005-registrering-sunnhetsbonus -> MWNG/Feature/2005-registrering-sunnhetsbonus  (forced update)
 * [new branch]      feature/2005-registrering-sunnhetsbonus -> MWNG/feature/2005-registrering-sunnhetsbonus
 * [new branch]      feature/azure-rest-api -> MWNG/feature/azure-rest-api
从上面的输出可以看出,可能存在两个不同但相关的问题。一个分支有一个强制推送更新,另一个没有,而这两个分支每次都应该是新的分支。

同样,问题与大小写折叠有关

问题可以归结为两部分:

  • Git的分支名称区分大小写
  • Git的分支名称有时通过文件名存储,在某些系统上,文件名(有时)不区分大小写
  • 这导致Git在这样的系统上混淆自己,恰恰是在通过文件名存储它们的位置:在这一点上,它们变得不区分大小写(尽管,至少,通常是保留大小写的),即使它们在其他地方是区分大小写的。现在Git不知道它是一个分支,还是两个不同的分支

    Git最终可能需要一种通用机制来处理MacOS HFS+和Windows文件系统上的这一问题和其他问题,这些文件系统默认设置为保留大小写但不区分大小写的模式(包括Linux在内的其他操作系统也可以这样做,但默认情况下不这样做)。在此之前,处理此问题最简单的方法(或者我应该说是最容易混淆的方法)是使用或借用区分大小写的系统(例如Linux机器),以所有常用的方式处理发生冲突的分支,并将它们从那里更新到服务器

    如果不可用,有一种相对简单的方法可以在不区分大小写(Mac或Windows)的客户端上修复此特定问题。请注意,我还没有对此进行测试。如果您只需要丢弃一个冲突的分支名称(请参见最后一段),它还可以简化得多

  • 运行
    git fetch
    ,例如
    git fetch mwn
    。这将带来所有分支,并将它们的信息放入
    .git/FETCH\u HEAD
    ,其中(因为它是文件数据)将记录所有引用及其ID

  • 选择一个要更改的名称。比方说,在这种情况下,您想用
    Feature/joe-used-a-bad-name
    (小写
    f
    ,我们要责备joe,不管他是谁)。从
    FETCH\u HEAD
    中查找哈希ID,注意获得正确的大小写组合。如果您有类似于
    awk
    的工具,您可以执行以下操作:

    awk '$4 == "'\''Feature/2005-registrering-sunnhetsbonus'\''" { print $1 }' < \
        .git/FETCH_HEAD
    
    (注意:如果缩写的SHA-1 ID是唯一的,您可以只使用它。如果不是,请粘贴准确的ID,这肯定会起作用。)

  • 使用
    git push
    删除坏名称:

    git push MWNG :Feature/2005-registrering-sunnhetsbonus
    
    (或者
    git push--delete MWNG Feature/2005 registerering sunnhetsbonus
    ,这是做同样事情的一种更长但更难忘的方式)。只要避免使用
    --delete
    标志:一个
    git push
    ,同时使用ID和新名称,以及空字符串和旧名称,就可以将其与步骤3结合使用

  • 最后,运行
    gitfetch--prune mwn
    以使用新名称更新您自己的存储库


  • 如果您不需要保留名称的一个版本,那么就容易多了:只需在“坏”名称上执行删除推送,再加上最后的带删减的fetch选项,以消除对您自己Git的混淆。

    看起来像是区分大小写的分支名称问题
    Feature/2005-*
    正在local.git/refs中创建一个新分支
    Feature/2005-*
    。你能验证一下这里列出的新分支是否在本地
    git branch
    中吗?我想你肯定了解了一些事情,这提醒了我我以前有过这样的经历。哦,在Mac上拥有一个可容忍大小写的文件系统的乐趣。。。
    git push MWNG :Feature/2005-registrering-sunnhetsbonus