【问题标题】:Git branch name - case sensitive or insensitive?Git 分支名称 - 区分大小写还是不区分大小写?
【发布时间】:2016-11-24 09:57:57
【问题描述】:

我是一个新的 git 用户,最近收到了一个过期的 git 存储库来照顾。

这是原始状态(由 git show-branch 输出):

! [cr232] CR 232 Release
        * [dev] Style Changes
---------------
        *   [dev] Style Changes
        *   [dev^] SMS 5.4
        *   [dev~2] Logo Change
        *   [dev~3] SMS 5.3
        *   [dev~4] SMS 5.2
        *   [dev~5] SIT R-0.3.3 EDW SMS Layers
        *   [dev~6] SIT Release R 0.3.0
       +*   [cr232] CR 232 Release
       +*   [cr232^] Dashboard Fix
       +*   [cr232~2] Release for system testing

请注意,此时有一个名为“dev”的分支。请注意,突出显示有几个对 dev 的引用(即 dev、dev^、dev~2 等)。

出于我的开发目的,我试图提出一个名为“DEV”的分支,全部资本。

所以我继续创建新分支(git branch DEV),现在运行 git show-branch --date-order:

! [DEV] Style Changes
    ! [cr232] CR 232 Release
        * [dev] Style Changes
---------------
        *   [DEV] Style Changes
        *   [DEV^] SMS 5.4
        *   [DEV~2] Logo Change
        *   [DEV~3] SMS 5.3
        *   [DEV~4] SMS 5.2
        *   [DEV~5] SIT R-0.3.3 EDW SMS Layers
        *   [DEV~6] SIT Release R 0.3.0
       +*   [cr232] CR 232 Release
       +*   [cr232^] Dashboard Fix
       +*   [cr232~2] Release for system testing

请注意,dev 和 DEV 都被列为分支。另请注意,在第 5 行,对 dev 的引用现在已更改为 DEV(即 DEV、DEV^、DEV~2 等)。

第 5 行输出指的是什么?我希望它保持“dev”而不是更改为“DEV”,因为它旁边的描述是指在“dev”分支期间对旧工作的描述。

我正在尝试通过将 DEV 分支名称修改为 DV(运行 git branch –m DEV DV)并显示分支现在看起来像这样来恢复原来的状态:

! [DV] Style Changes
    ! [cr232] CR 232 Release
        * [dev] Style Changes
---------------
        *   [DV] Style Changes
        *   [DV^] SMS 5.4
        *   [DV~2] Logo Change
        *   [DV~3] SMS 5.3
        *   [DV~4] SMS 5.2
        *   [DV~5] SIT R-0.3.3 EDW SMS Layers
        *   [DV~6] SIT Release R 0.3.0
       +*   [cr232] CR 232 Release
       +*   [cr232^] Dashboard Fix
       +*   [cr232~2] Release for system testing

请注意,该分支现在包括 DV 和 dev。另请注意,第 5 行对 dev 的引用现在已更改为 DV(即 DV、DV^、DV~2 等)。

有没有什么办法可以让 DV 参考资料恢复到原始状态? git 是否感到困惑并用一个相似的分支重命名了我的历史信息,只是大写不同?

请协助我解决此问题。多谢了

【问题讨论】:

标签: git github version-control git-branch


【解决方案1】:

只回答主题行中的问题,而不涉及任何关于git show-branch 的内容(like ElpieKay,我从未真正使用过git show-branch;这似乎主要是信息错误):

Git 分支名称——和标签名称,以及所有其他的 reference 名称,正如 Git 所说的——最初是 打算区分大小写的。

这一切都可以在 Linux / Unix 机器上完美运行,其中 Git 的代码一开始就区分大小写。当 Git 在文件系统中存储分支名称时作为文件名(它只有时这样做),文件系统也是区分大小写的。1

有时在 Windows 和某些 MacOS 系统上会失败。具体来说,当 Git 将引用存储在单个文件中时,它会失败,这些文件的名称是从引用名称派生的,并且这些文件名不区分大小写(例如,保留大小写,但在名称匹配期间折叠大小写;甚至将所有内容都转换为大写- 仅限,就像在真正古老的 FAT 8.3 格式中一样,但我们希望现代文件系统不会这样做)。

如上所述,Git 并不总是将引用名称存储为文件名。事实上,在初始克隆时,所有名称都在一个名为 .git/packed-refs,2 的文件中,因此此时它们区分大小写。但随着时间的推移,它们会“解包”,3,然后在某些系统上,它们会变成大小写折叠。

因为它有时在某些系统上会失败,所以通常最好避免使用多个仅区分大小写的引用名称。


1当然,在现代 Unix/Linux 系统上,您现在可以访问保留大小写但不区分大小写的文件系统,并且现在可以告诉 Windows 和 MacOS 不要这样做某些文件系统的大小写折叠。 (但是,如果您更改默认设置,则预期用于您的盒子的软件会失败,因为它会失败。像 Photoshop 之类的内部尝试使用名为 fooFOO 的文件,并希望它引用同一个文件! )

2这个打包引用文件已经存在了很长一段时间,但不是永远存在,而且非常早期的 Git 版本可能不会使用它。在内部,Git 正在获得一个新的“可插入引用名称接口”,未来版本的 Git 可能既不使用此文件,也不使用单独的 per-reference 文件。

3通常,创建或更新引用会导致解压的引用文件出现。运行git pack-refs --all 将用打包的引用替换未打包的引用,恢复完全区分大小写。如果没有--allgit pack-refs 只会打包已经打包的引用,这在很大程度上是一种无用的操作模式(它是为不再使用的情况而设计的)。

【讨论】:

  • 有人需要创建一个新问题,以便我们可以将 torek 的答案附加到新问题并使其成为可接受的答案。这个答案迫切需要更广泛的曝光。尤其是关于打包引用和分支名称在 repo 的生命周期内被 git 处理不一致的部分。
【解决方案2】:

所以我继续创建新分支(git branch DEV)

当您在分支 dev 上时,您创建了一个新分支 DEV。所以DEVdev 是指向同一个提交的两个分支。将DEV 重命名为DV 后,现在DVdev 是指向同一个提交的两个分支。

一切都很好。如果你不想DV 打扰你,你可以运行git branch -d DV 来删除它。如果你确实想创建一个新的分支,最好遵循一些不会混淆你和其他人的命名规则。

我从未使用过git show-branchgit log --oneline --all --graph --decorate=full 绘制清晰的日志图。

【讨论】:

  • 我希望是这样。但为了澄清一下,在我创建 DEV 之后,我还在 dev 分支上创建了另外两个名为 TST 和 PRD 的分支。所以这两个也指向同一个提交。但是为什么在我创建 DEV 分支时引用只发生变化?
  • @Nora 我做了一些测试并找到了规则。 -------- 上面的部分,分支按某种顺序排序。如果git show-branch 没有任何选项,则为字母顺序。 --------- 下方的部分,如果某些分支指向同一个提交,则将其中的第一个列为委托。 DEV 在 TST 和 PRD 之前,所以它是它们的代表。
  • @Nora 和我发现了更多信息。我猜你的 show-branch 输出中标记 + 的位置是错误的。它们应该在第一个 ! 标记的正下方。并且!s 有不同的颜色,如果可以从上面的分支访问下面的提交,则在! 的正下方有一个+ 代表该分支。签出的分支以 * 为前缀。
  • 感谢您的澄清,如果我继续删除 DV,它是否也会删除引用?而且,您的第二条评论看起来不正确,因为我只将整个内容的一部分发布在这里。原始标记看起来像 + + + * [DV] 样式更改 + + + * [DV^] SMS 5.4 + + + * [DV~2] 徽标更改 + + + * [DV~3] SMS 5.3 + + + * [DV~4]短信5.2
  • @Nora DV 是参考资料之一。它是一个存储提交 sha1 或它指向的另一个 ref 的变量。删除它不会丢失任何提交历史记录。
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2019-10-22
  • 2012-02-03
  • 2023-03-25
  • 2012-12-01
相关资源
最近更新 更多