在克隆一个git仓库时,我得到一个错误消息,我不能完全理解。
$ git clone git@pinocchio.unibe.ch:group07
Initialized empty Git repository in /cygdrive/C/Users/Martin Bigler/p2/group07/.
remote: Counting objects: 2269, done.
remote: Compressing objects: 100% (1936/1936), done.
git: 'index-pack' is not a git-command. See 'git --help'.
什么可能导致这种行为?
1条答案
按热度按时间46scxncf1#
这与ticket 269相似吗?
git index-pack
不是git.exe
中内置的,所以git.exe
需要在$GIT_EXEC_PATH
中找到git-index-pack.exe
(通常应该是“/libexec/git-core/
”)。你有“/libexec/git-core/git-index-pack.exe
“吗?因为如果是的话,这是导致错误的服务器,而不是本地安装的git进行推送。
您可以尝试交互式记录并检查index-pack是否可用:
该测试提示了以下答案:
交互登录时找到您的
git-index-pack
。但显然不是当你不登录交互式。
这表明您在
$HOME/.profile
或$HOME/.bash_profile
中适当地调整了PATH
,但在HOME/.bashrc
中没有调整结论是:
我的解决方案是:
请注意,在Git 2.25.2(2020年3月)中,index-pack代码现在诊断出一个错误的输入包流,当它被用作delta base时,它记录了同一个对象两次;当遇到这样的输入时,用于声明软件错误的代码,但它是输入错误。
参见commit a217810(2020年2月3日),作者Jeff King (
peff
)。(由Junio C Hamano --
gitster
--合并至commit 7b029eb,2020年2月14日)index-pack
:将两次解析的REF_DELTA
降级到die()签字人:杰夫·金
当我们解析
REF_DELTA,
时,我们将其类型从REF_DELTA
比较并交换到基对象的任何真实的类型,如ab791dd138(“index-pack
:fix race condition with duplicate bases”,2014-08-29,Git v2.2.0-rc0 -- merge).如果旧的类型不是
REF_DELTA,
,我们认为这是一个BUG()。但是正如在那次提交中所讨论的,每当我们尝试解析一个对象两次时,我们可能会看到这种情况,这可能会发生,因为我们有多个基本对象的副本。所以这根本不是一个bug,而是输入包损坏的信号。事实上,这种情况已经在t5309.5和t5309.6中触发,它们产生了具有δ循环和重复碱基的包。但我们从来没有注意到,因为这些测试都标记为
expect_failure
。这些测试是由b2ef3d9ebb添加的(“test index-pack on packs with recoverable delta cycle”,2013-08-23,Git v1.8.5-rc 0--merge listed in batch #4),这为我们理论上可以处理的情况敞开了大门。
当我们看到这样一个已经解析的对象时,理论上我们可以在确认之前解析的
child->real_type
与base->obj->real_type
匹配后继续。但是:
如果我们继续,那么t5309.5中的delta循环会导致我们无限循环,因为
find_ref_delta_children()
没有意识到哪些对象已经被解析。所以要想让这个案子成功,还需要做更多的改变,而与此同时,我们的情况会更糟。
它要么有一个重复的基本对象,要么有一个循环,导致我们通过
--fix-thin
引入一个副本。无论哪种情况,我们最终都会拒绝
write_idx_file()
中的包,它也会检测重复项。因此,这些测试在记录我们可以做什么方面几乎没有价值(并且已经被忽视了6年多)。
让我们将它们切换到确认我们干净地处理了这个案例(并将
BUG()
切换为信息量更大的die()
,以便我们这样做)。随着Git 2.30(2021年第一季度)的发布,当
.idx
文件被删除时访问packdata的进程(例如:而重新 Package )没有失败或回落优雅,因为他们可以。参见commit 506ec2f,commit c8a45eb(2020年11月25日)by Taylor Blau (
ttaylorr
)。(由Junio C Hamano --
gitster
--合并于commit 6bac6a1,2020年12月8日)packfile.c
:防止索引消失共同撰写人:杰夫·金
签字人:泰勒·布劳
在17c35c8969(“
packfile
:skip loading index if in multi-pack-index”,2018-07-12,Git v2.20.0-rc 0--merge listed in batch #1)我们停止加载包含在多包索引中的包的.idx
文件。这节省了我们加载
.idx
和通过'packfile.c
:load_idx()'进行一些轻量级有效性检查的工作,但在需要加载索引(例如,生成反向索引)的进程和可以删除索引的进程之间引入了竞争。例如,在shell中运行以下命令:
接着是:
将导致此修补程序之前的segfault。
这里发生的事情是,我们注意到包在多包索引中,因此不检查它是否仍然有
.idx
。当我们尝试加载该索引以生成反向索引时,我们没有它,因此在'
packfile.c
:packed_object_info()
'中调用'find_pack_revindex()
'返回NULL
,然后解引用它会导致segfault。当然,我们不希望有人手动删除索引文件,或者处于我们从未写开始它的状态(但在multi-pack-index中找到该包)。但是,这可能发生在与'
git repack -ad
'(man)的时间竞赛中,它在写入包含所有对象的新包后删除所有现有包。通过恢复17c35c8969的块来避免这种情况,当包包含在
MIDX
中时,该块将停止加载索引。这使得17c35c8969的后半部分无用,因为我们总是有一个非NULL的
'p->index_data',
,在这种情况下,if语句不保护任何东西。这两个一起有效地恢复了17c35c8969,并避免了上面解释的竞争。
在Git 2.31(2021年第一季度)中,引入一个磁盘文件来记录packdata的revindex,传统上它总是在运行中创建,并且只在核心中创建。
参见commit 6885cd7(2021年1月28日),以及commit ec8e776、commit e8c58f8、commit 35a8a35、commit 1615c56、commit c977334、commit e37d0b8、commit 84d5449、commit 8ef50d9、commit 2f4ba2a(2021年1月25日)和Taylor Blau (
ttaylorr
)。(由Junio C Hamano --
gitster
--合并于commit 3c12d0b,2021年2月12日)pack-revindex
:确保磁盘上的反向索引具有优先级签字人:泰勒·布劳
当磁盘上存在反向索引时,不需要在内存中生成一个。
事实上,这样做可能会很慢,并且需要大量的堆。
让我们通过教Git如何在内存中生成反向索引时有条件地die()来确保我们以优先级处理磁盘上的反向索引(即,当它存在时,我们不必费心在内存中生成一个等效的索引)。
然后,添加一个测试,以确保当(a)磁盘上的反向索引存在时,以及(B)当设置
GIT_TEST_REV_INDEX_DIE_IN_MEMORY,
时,我们不会死亡,这意味着我们从磁盘上读取。在Git 2.34(2021年第4季度)中,组成单个(概念性)包文件的各种文件的顺序已经重新评估和理顺。
这关系到正确性,因为不完整的文件集不能显示给运行中的Git。
参见commit 4bc1fd6、commit 2ec02dd、commit 8737dab、commit 66833f0(2021年9月9日)和commit 0c41a88(2021年9月8日),作者Ævar Arnfjörð Bjarmason (
avar
)。参见commit 522a5c2、commit 4e58ced、commit 16a8690、commit ae44b5a(2021年9月9日)by Taylor Blau (
ttaylorr
)。(由Junio C Hamano --
gitster
--合并至commit a1af533,2021年9月20日)index-pack
:在final()中重构重命名签字人:埃瓦尔·阿恩菲约德·比亚马逊
签字人:泰勒·布劳
将final()中的重命名重构为一个helper函数,这在精神上类似于前面在
pack-write.c
中对finish_tmp_packfile()
的重构。e37d0b8之前(“
builtin/index-pack.c
:write reverse indexes”,2021-01-25,Git v2.31.0-rc 0--merge listed in batch #8)可能不值得使用这种帮助程序,因为“pack”文件和“s.g.“idx”文件。
但是既然我们现在也有了“rev”,让我们通过一个助手来重命名,这既减少了行数,又提高了可读性,因为我们可以很容易地看到,除了
"*final_name"
是NULL
和"make_read_only_if_same"
是不同的明显不同情况之外,编写这三种类型文件的逻辑是完全相同的。此外,从备用对象数据库借用的存储库中的几何重新打包(“
git repack --geometric=<n>
”(man))存在各种极端情况错误,这些错误已通过Git 2.41(2023年第二季度)得到纠正。参见commit d85cd18、commit 932c16c、commit 19a3a7b、commit f302841、commit 752b465、commit 732194b、commit b7b8f04、commit 5186134、commit 3d74a23、commit ceb96a1(2023年4月14日)至Patrick Steinhardt (
pks-t
)。(由Junio C Hamano --
gitster
--合并于commit 36628c5,2023年4月25日)pack-objects
:修复错误时,相同的包文件是包括和排除签字人:帕特里克·斯坦哈特
当通过
--stdin-packs
选项传递包含和排除的同一个包文件时,我们将返回一个错误,因为无法找到排除的包文件。这是因为我们只会在找到包含的packfile列表时为它设置
util
指针,所以当我们注意到它实际上没有为排除的packfile列表设置时,我们会死。通过始终为包含和排除的列表条目设置
util
指针来修复此错误。Git 2.41(Q2 2023):允许从包偏移量Map到存储在该偏移量处的对象的对象名的盘上反向索引已经被默认启用。
参见commit 9f7f10a、commit a8dd7e0、commit dbcf611、commit 2a250d6、commit 65308ad、commit b77919e、commit 3969e6c(2023年4月12日)by Taylor Blau (
ttaylorr
)。(由Junio C Hamano --
gitster
--合并于commit 849c8b3,2023年4月27日)pack-revindex
:GIT_TEST_REV_INDEX_DIE_ON_DISK
介绍签字人:泰勒·布劳
作者:Derrick Stolee
在ec8e776(“
pack-revindex
:确保磁盘上的反向索引具有优先级”,2021-01-25,Git v2.31.0-rc 0--merge在batch #8中列出),我们引入了GIT_TEST_REV_INDEX_DIE_IN_MEMORY
,以便在Git从头开始生成反向索引时中止该过程。ec8e776是为了确保Git更喜欢
.rev
文件,而不是从头开始在内存中生成相同的信息。在后续的补丁中,我们将介绍
pack.readReverseIndex
,它可以用来在可用时禁用阅读“.rev
”文件。为了确保这些文件确实被忽略,引入一个类似的选项,当Git从磁盘读取“
.rev
“文件时,可以中止该过程。