我有一个GIT存储库,我想创建一个工作树。存储库如下所示:
alpha
.git
Part a
Part b
我执行命令gitworktree add ../beta beta
(beta是alpha的分支)。我:
beta
.git
alpha
Part a
Part b
我希望复制的工作树看起来像原来的,只有分支测试签出:
beta
.git
Part a
Part b
我做错了什么?
可能是alpha库坏了。
如前所述,git fsck
是检查是否有问题的正确工具。
With Git 2.41 (Q2 2023), "git fsck
">(man)学会了检查其他工作树中的索引文件,就像"git gc
">(man)将它们视为锚点。
参见Jeff King (peff
)的commit 8d3e7ea(2023年2月26日)和commit 592ec63, commit fb64ca5, commit 8840069(2023年2月24日)。
(由juno C Hamano—gitster
—在2023年3月17日提交2d019f4)
fsck
:提及索引错误的文件路径署名:Jeff King
如果在索引文件中遇到错误,我们可以这样说:
error: 1234abcd: invalid sha1 pointer in resolve-undo
但是,如果您有多个工作树,每个工作树都有自己的索引,那么知道哪个文件有问题将非常有帮助。
因此,让我们通过各种
index-fsck
函数传递该路径并在适当的地方使用它。
在这个补丁之后,你应该得到这样的东西:error: 1234abcd: invalid sha1 pointer in resolve-undo of .git/worktrees/wt/index
这有点啰嗦,但既然重点是你通常不应该看到这个,我们最好还是多说一些细节。
我还将索引文件名添加到"使用的名称中。
fsck --name-objects
",如果我们发现对象丢失,它将显示出来,等等。
这稍微改变了规则,因为该选项声称编写可以提供给rev-parse的名称。
但是没有修改语法来访问另一个工作树的索引,所以我们能做的最好的就是编一些人类可能理解的东西。我确实小心地保留了现有的"
:file
";当前工作树的语法。
所以只有在真正需要的时候才会出现难看的输出。
对于Git 2.42 (Q3 2023),这是明确的:
见commit 6e6a529 (29 june 2023) by Eric Sunshine (sunshineco
)。
(由juno C Hamano—gitster
—在commit b00ec25,2023年7月8日合并)
fsck
:避免误导变量名署名:Eric Sunshine
署名:Jeff King
当报告问题时,
git fsck
(man)发出如下消息:missing blob 1234abcd (:file)
但是,当在工作树的索引中检测到问题时,而不是在调用
git fsck
的工作树的索引中检测到问题时,这可能是不明确的。
为了解决这个缺点,592ec63 ("fsck
:提到索引错误的文件路径,2023-02-24,Git v2.41.0-rc0——合并在批#2中列出)增强了输出,当在其他工作树中检测到问题时,提到索引的路径:missing blob 1234abcd (.git/worktrees/wt/index:file)
不幸的是,
fsck_index()
中控制是否应该显示索引路径的变量被错误地命名为"is_main_index"
,这可能被误解为指的是主工作树(即
容纳.git/
存储库的工作树)而不是当前工作树(即调用git fsck
的工作树)。
通过选择一个更能反映其实际用途的名称来避免这种潜在的混淆。