分支存在但在 refs/heads 中看不到

Branch exists but cannot be seen in refs/heads

在 BitBucket 服务器机器上的裸存储库(无工作文件夹)中,我有两个发布分支:

# git branch --list | grep release
warning: ignoring broken ref refs/heads/integration/Team
  release/2018r1
  release/2018r2

但是如果我查看 refs/heads,这两个分支都看不到:

# ls refs/heads/release
testing

testing分支是前段时间删除的分支

release/2018r1release/2018r2 怎么可能存在(并被 git branch --list 看到)但不出现在 refs/heads 中?

为什么旧的 release/testing 分支出现在 refs/heads 中,而它已经不存在了?

引用名称可以是packed(存储在.git/packed-refs,这是一个普通文件)或unpacked(存储每个文件一个)。以解压和打包形式存在的引用将其当前值存储在解压副本中,即打包副本不会自动删除。

在这种情况下,两个 "invisible" 引用无疑是打包的。我不清楚 refs/heads/release/testing.

发生了什么

Git 的未来版本可能会完全停止在纯文本文件中存储参考名称,因为文件名在 Windows 和 MacOS 文件系统上存在大小写折叠问题。使用git for-each-refgit update-ref(以及类似的)读取和写入参考值,以便为将来使用实际键值数据库的Git做好准备。