gpt4 book ai didi

git - 为什么 `git update-ref -d` 不删除空的父目录?

转载 作者:行者123 更新时间:2023-12-04 07:38:44 24 4
gpt4 key购买 nike

git 中有各种类型的引用,其中一些最常见的是分支(存储在 .git/refs/heads 中)、远程跟踪分支( .git/refs/remotes )和标签( .git/refs/tags )。
但是也可以创建和使用位于 .git/refs 下的任意非标准引用。 .这对于将自定义元数据存储在您不希望用户直接与之交互的存储库中非常有用。例如,GitHub 将这些类型的引用用于 expose references to pull request branches ,以及 Emacs git 客户端 Magit使用它们定期保存未提交的更改,when the appropriate setting is enabled .这样的引用通常需要使用 git 所谓的“管道”命令来操作,因为面向用户的“瓷器”命令不知道或不支持它们。
我正在使用管道命令 git update-ref 来处理非标准引用。并发现了一些奇怪的行为:

$ git init foo && cd foo
$ touch a && git add a && git commit -m init
$ tree .git/refs
.git/refs
├── heads
│   └── master
└── tags

2 directories, 1 file
$ git update-ref refs/foo/bar/baz HEAD
$ tree .git/refs
.git/refs
├── foo
│   └── bar
│   └── baz
├── heads
│   └── master
└── tags

4 directories, 2 files
$ git update-ref -d refs/foo/bar/baz
$ tree .git/refs
.git/refs
├── foo
├── heads
│   └── master
└── tags

3 directories, 1 file
当我创建引用时 refs/foo/bar/baz , git update-ref创建了必要的父目录。当我删除 ref 时,它足够聪明地删除父目录 bar ,现在已经空了。但是,删除“祖父”目录 foo 不够聪明。 , 在删除 bar 后现在也是空的.
这是一个错误吗?

最佳答案

不,这是设计使然。这是a comment from the source code :

/*
* Remove empty parent directories associated with the specified
* reference and/or its reflog, but spare [logs/]refs/ and immediate
* subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or
* REMOVE_EMPTY_PARENTS_REFLOG.
*/
static void try_remove_empty_parents(struct files_ref_store *refs,
const char *refname,
unsigned int flags)
{
如果我将我的非标准引用嵌套更深一层,例如 refs/foo/bar/baz/xyzzy ,我会注意到父目录和祖 parent 目录都被删除了,但曾祖 parent 没有,这更明显地表明这种行为是故意的。
我想这个想法是 .git/refs/ 下的顶级子目录(如我的示例中的 foo)代表一种类型的引用而不是引用名称的一部分,因此将它们与树更下方的目录(如我的示例中的 bar)区别对待是有道理的。

关于git - 为什么 `git update-ref -d` 不删除空的父目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67604566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com