分支存在但在 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/2018r1
和 release/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-ref
和git update-ref
(以及类似的)读取和写入参考值,以便为将来使用实际键值数据库的Git做好准备。
在 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/2018r1
和 release/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-ref
和git update-ref
(以及类似的)读取和写入参考值,以便为将来使用实际键值数据库的Git做好准备。