首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么git总是用强制更新来重新创建分支?

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

Stack Overflow用户
提问于 2016-09-19 17:03:24
回答 1查看 231关注 0票数 1

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

代码语言:javascript
复制
$ 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

从上面的输出可以看出,可能有两个问题,但相关的问题。一个分支有一个强制的推送更新,而另一个没有,而这两个分支每次都应该是新的分支。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 00:07:09

作为acsrujan noted in a comment,这个问题与案例折叠有关。

这个问题可以归结为两部分:

  1. Git的分支名区分大小写。
  2. Git的分支名称有时通过文件名存储,而在某些系统中,文件名(有时)不区分大小写。

这使得Git在这样的系统上感到困惑,恰恰是在通过文件名存储它们的时候:它们在那时变得对大小写敏感(至少通常是保持大小写的),尽管它们在其他地方是区分大小写的。现在Git不知道是一个分支,还是两个不同的分支。

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

如果这是不可用的,那么在不区分大小写的(Mac或Windows)客户端上有一种相对简单的方法来解决这个特定的问题。请注意,我还没有测试过这个。如果您只需要丢弃一个碰撞的分支名称(请参阅最后一段),它也可以简化得更多。

  1. 运行git fetch <remotename>,例如,git fetch MWNG。这将带来所有分支,并将它们的信息放到.git/FETCH_HEAD中(因为它是文件数据),后者将记录所有引用及其ID。
  2. 选择要更改的名字之一。比方说,在这种情况下,您希望用Feature/2005-registrering-sunnhetsbonus (小写f,我们指责乔,不管他是谁)代替他。从FETCH_HEAD中查找散列ID,小心地获得正确的大小写混合。如果您有一个像awk这样的工具,您可以这样做: $4 "'\''Feature/2005-registrering-sunnhetsbonus'\''“(打印$1 })<\..git/ == _HEAD 但是,只查看文件(使用lessmore或您最喜欢的编辑器)可能是最简单的。
  3. 使用git push创建一个新的、命名更好的分支,指向同一个ID (在本例中,该ID将以022873b开头): git推MWNG 022873b...:refs/heads/feature/joe-used-a-bad-name (注意:如果SHA-1 ID是唯一的,您可以使用它。如果没有,粘贴到确切的ID中,这肯定会起作用。)
  4. 使用git push删除坏名称: git push MWNG :Feature/2005-注册-Sunnhets红利 (或者git push --delete MWNG Feature/2005-registrering-sunnhetsbonus,这是一种更长但更值得纪念的方式来做同样的事情)。只要您避免使用--delete标志,就可以将其与步骤3结合起来:一个git push具有ID和新名称以及空字符串和旧名称。
  5. 最后,运行git fetch --prune MWNG,用新名称更新自己的存储库。

如果您不需要保留名称的一个版本,这就容易得多了:只需对“坏”名称执行删除推送,再加上最后的fetch-with-prune-选项,以避免混淆您自己的Git。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39578431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档