这是否类似于票 269?
git index-pack
不是内置的git.exe
, so git.exe
需要找到git-index-pack.exe
in $GIT_EXEC_PATH
(通常应该是“/libexec/git-core/
“)。 你有 ”/libexec/git-core/git-index-pack.exe
"?
因为如果是,则这是导致错误的服务器,而不是本地安装的 git 进行推送。
您可以尝试以交互方式记录日志并检查索引包是否可用:
$ ssh git#***.com@***.com
Enter passphrase for key '/c/Users/***/.ssh/id_rsa':
Last login: Tue Feb 9 13:48:32 2010 from ***
-bash-3.2$ git version
git version 1.6.1
-bash-3.2$ git-index-pack
usage: git index-pack [-v] [-o <index-file>] [{ ---keep | --keep=<msg> }] [--strict]
{ <pack-file> | --stdin [--fix-thin] [<pack-file>] }
该测试给出了以下答案:
Your git-index-pack
交互登录时发现。
但当您不交互式登录时显然不会。
这表明你调整了你的PATH
适当地在$HOME/.profile
or $HOME/.bash_profile
,但不在HOME/.bashrc
结论是:
我的解决方案是:
ssh user@server
cp .bash_profile .bashrc
请注意,对于 Git 2.25.2(2020 年 3 月),索引包代码现在可以诊断记录同一对象两次的错误输入包流当它用作 Delta 基时;遇到此类输入时用于声明软件错误的代码,但它是输入错误。
See commit a217810 (03 Feb 2020) by Jeff King (peff).
(Merged by Junio C Hamano -- gitster -- in commit 7b029eb, 14 Feb 2020)
index-pack: 降级两次解决REF_DELTA
去死()
Signed-off-by: Jeff King
当我们解决一个REF_DELTA,
我们比较并交换它的类型REF_DELTA
到基础对象具有的任何实际类型,如中讨论的ab791dd138 ("index-pack
:修复重复碱基的竞争条件”,2014-08-29,Git v2.2.0-rc0 --merge).
如果旧类型不是REF_DELTA,
我们认为这是一个 BUG()。但正如该提交中所讨论的,每当我们尝试两次解析一个对象时,我们都可能会看到这种情况,这可能会发生,因为我们有基础对象的多个副本。
所以这根本不是一个错误,而是输入包损坏的迹象。事实上,这种情况已经在 t5309.5 和 t5309.6 中触发,它们创建了具有增量循环和重复碱基的包。但我们从未注意到,因为这些测试都被标记了expect_failure
.
这些测试是由b2ef3d9ebb(“在具有可恢复增量周期的包上测试索引包”,2013-08-23,Git v1.8.5-rc0 --merge列于batch #4),这为我们理论上认为的情况敞开了大门could handle.
当我们看到这样一个已经解析的对象时,理论上我们可以在确认之前解析的对象后继续进行child->real_type
火柴base->obj->real_type
.
But:
-
在这里强制执行“仅解析一次”规则可以使我们免于代码其他部分的无限循环。
如果我们继续下去,那么 t5309.5 中的 delta 循环会导致我们无限循环,如下所示find_ref_delta_children()
不知道哪些对象已经被解析。
因此,需要进行更多更改才能使此案例发挥作用,同时我们的情况会更糟。
-
无论如何,任何触发此问题的包都会被破坏。
它要么有一个重复的基础对象,要么有一个循环,导致我们通过以下方式引入重复的对象--fix-thin
.
无论哪种情况,我们最终都会拒绝该包裹write_idx_file()
,它还可以检测重复项。
所以测试对于记录我们的内容没有什么价值could正在做的事情(并且已经被忽视了 6 年多)。
让我们切换它们以确认我们干净地处理了这个案例(并切换出BUG()
以获得更多信息die()
以便我们这样做)。
使用 Git 2.30(2021 年第 1 季度),访问 packdata 的进程.idx
文件被删除(例如,重新打包时)并没有失败或优雅地回退。
See commit 506ec2f, commit c8a45eb (25 Nov 2020) by Taylor Blau (ttaylorr).
(Merged by Junio C Hamano -- gitster -- in commit 6bac6a1, 08 Dec 2020)
packfile.c:防止索引消失
Co-authored-by: Jeff King
Signed-off-by: Taylor Blau
In 17c35c8969 ("packfile
: 如果在 multi-pack-index 中则跳过加载索引", 2018-07-12, Git v2.20.0-rc0 --merge列于batch #1)我们停止加载.idx
多包索引中包含的包的文件。
这节省了我们加载的精力.idx
并通过 ' 进行一些轻量级有效性检查packfile.c:load_idx()',但是在需要加载索引(例如,生成反向索引)的进程和可以删除索引的进程之间引入了竞争。
例如,在 shell 中运行以下命令:
$ git init repo && cd repo
$ git commit --allow-empty -m 'base'
$ git repack -ad && git multi-pack-index write
其次是:
$ rm -f .git/objects/pack/pack-*.idx
$ git rev-parse HEAD | git cat-file --batch-check='%(objectsize:disk)'
在此补丁之前将导致段错误.
这里发生的情况是,我们注意到该包位于多包索引中,因此不检查它是否仍然有.idx
.
当我们尝试加载该索引以生成反向索引时,我们没有它,因此调用 'find_pack_revindex()
' in 'packfile.c:packed_object_info()
' 返回NULL
,然后取消引用它会导致段错误。
Of course, we don't ever expect someone to remove the index file by hand, or to be in a state where we never wrote it to begin with (yet find that pack in the multi-pack-index). But, this can happen in a timing race with 'git repack -ad'(man), which removes all existing packs after writing a new pack containing all of their objects.
通过恢复大块来避免这种情况17c35c8969当包包含在 a 中时,它将停止加载索引MIDX
.
这使得后半段17c35c8969无用,因为我们总是有一个非 NULL'p->index_data',
在这种情况下, if 语句不保护任何内容。
这两个一起有效地恢复17c35c8969,并避免上面解释的竞争。
在 Git 2.31(2021 年第 1 季度)中,引入一个磁盘文件来记录 packdata 的 revindex,传统上该文件总是动态创建且仅在核心内创建。
See commit 6885cd7 (28 Jan 2021), and commit ec8e776, commit e8c58f8, commit 35a8a35, commit 1615c56, commit c977334, commit e37d0b8, commit 84d5449, commit 8ef50d9, commit 2f4ba2a (25 Jan 2021) by Taylor Blau (ttaylorr).
(Merged by Junio C Hamano -- gitster -- in commit 3c12d0b, 12 Feb 2021)
pack-revindex:确保磁盘上的反向索引优先
Signed-off-by: Taylor Blau
当磁盘上存在反向索引时,无需在内存中生成反向索引。
事实上,这样做可能很慢,并且需要大量的堆。
让我们通过教 Git 在生成反向索引时如何有条件 die() 来确保我们优先处理磁盘上的反向索引(即,当它存在时,我们不会费心尝试在内存中生成等效的索引)在记忆中。
然后,添加一个测试以确保当 (a) 磁盘上反向索引存在时,以及 (b) 设置时GIT_TEST_REV_INDEX_DIE_IN_MEMORY,
我们不会死,这意味着我们从磁盘上读取数据。
在 Git 2.34(2021 年第 4 季度)中,组成单个(概念)包文件的各种文件的顺序已被重新评估和理顺。
这对于正确性很重要,因为不能向正在运行的 Git 显示不完整的文件集。
See commit 4bc1fd6, commit 2ec02dd, commit 8737dab, commit 66833f0 (09 Sep 2021), and commit 0c41a88 (08 Sep 2021) by Ævar Arnfjörð Bjarmason (avar).
See commit 522a5c2, commit 4e58ced, commit 16a8690, commit ae44b5a (09 Sep 2021) by Taylor Blau (ttaylorr).
(Merged by Junio C Hamano -- gitster -- in commit a1af533, 20 Sep 2021)
index-pack: 在 Final() 中重构重命名
Signed-off-by: Ævar Arnfjörð Bjarmason
Signed-off-by: Taylor Blau
将 Final() 中的重命名重构为辅助函数,这在精神上类似于前面的重构finish_tmp_packfile()
in pack-write.c.
Before e37d0b8 ("builtin/index-pack.c:编写反向索引”,2021-01-25,Git v2.31.0-rc0 --merge列于batch #8)由于“pack”文件与“pack”文件的“else if”情况不同,拥有这种帮助器可能不值得。
“idx”文件。
但是既然我们现在也有了“rev”,那么让我们通过助手进行重命名,这既减少了行数,又提高了可读性,因为我们可以很容易地一眼看出编写这三个内容的逻辑除了明显不同的情况外,文件类型完全相同"*final_name"
being NULL
, and "make_read_only_if_same"
与众不同。
Also, Geometric repacking ("git repack --geometric=<n>"(man)) in a repository that borrows from an alternate object database had various corner case bugs, which have been corrected with Git 2.41 (Q2 2023).
See commit d85cd18, commit 932c16c, commit 19a3a7b, commit f302841, commit 752b465, commit 732194b, commit b7b8f04, commit 5186134, commit 3d74a23, commit ceb96a1 (14 Apr 2023) by Patrick Steinhardt (pks-t).
(Merged by Junio C Hamano -- gitster -- in commit 36628c5, 25 Apr 2023)
pack-objects:修复包含和排除相同包文件时的错误
Signed-off-by: Patrick Steinhardt
当通过包含和排除相同的包文件时--stdin-packs
选项,那么我们将返回一个错误,因为找不到排除的包文件。
这是因为我们只会设置util
如果找到了包含的包文件列表的指针,这样当我们注意到它实际上没有为排除的包文件列表设置时,我们就会死掉。
通过始终设置来修复此错误util
包含和排除列表条目的指针。
而且,在 Git 2.41(2023 年第 2 季度)中:默认情况下启用了磁盘反向索引,该索引允许从包偏移量映射到存储在偏移量处的对象的对象名称。
See commit 9f7f10a, commit a8dd7e0, commit dbcf611, commit 2a250d6, commit 65308ad, commit b77919e, commit 3969e6c (12 Apr 2023) by Taylor Blau (ttaylorr).
(Merged by Junio C Hamano -- gitster -- in commit 849c8b3, 27 Apr 2023)
pack-revindex: 介绍GIT_TEST_REV_INDEX_DIE_ON_DISK
Signed-off-by: Taylor Blau
Acked-by: Derrick Stolee
In ec8e776 ("pack-revindex
:确保磁盘上的反向索引优先”,2021-01-25,Git v2.31.0-rc0 --merge列于batch #8),我们介绍了GIT_TEST_REV_INDEX_DIE_IN_MEMORY
当 Git 从头开始生成反向索引时中止该过程。
ec8e776是为了确保 Git 更喜欢.rev
文件可用时从头开始在内存中生成相同的信息。
在后续补丁中,我们将引入pack.readReverseIndex
,可用于禁用读取“.rev
” 文件可用时。
为了确保这些文件确实被忽略,请引入一个类似的选项,以便在 Git 读取“.rev
“来自磁盘的文件。