“在哪里?”;git更新索引--假定文件未更改;是否将此信息保存到?

“在哪里?”;git更新索引--假定文件未更改;是否将此信息保存到?,git,git-index,Git,Git Index,我喜欢直接修改配置文件(如.gitignore和.git/config),而不是记住任意命令,但我不知道git将传递到“git更新索引--假定未更改文件”的文件引用存储在哪里 如果你知道,请告诉我 它显示命令中的位置-git更新索引 因此,您不能真正编辑索引,因为它不是文本文件 另外,要详细说明使用git update index--assession unchanged命令存储的内容,请参阅使用“assession unchanged”位的,正如其他人所说,它存储在位于.git/index的索

我喜欢直接修改配置文件(如.gitignore和.git/config),而不是记住任意命令,但我不知道git将传递到“git更新索引--假定未更改文件”的文件引用存储在哪里


如果你知道,请告诉我

它显示命令中的位置-git更新索引

因此,您不能真正编辑索引,因为它不是文本文件


另外,要详细说明使用
git update index--assession unchanged
命令存储的内容,请参阅使用“assession unchanged”位的
,正如其他人所说,它存储在位于
.git/index
的索引中

经过一些调查工作,我发现它位于每个索引项的:位

因此,在理解以下内容之前,您应该首先了解索引的全局格式,如中所述

接下来,我将解释如何验证“假定有效”位是罪魁祸首:

  • 经验性
  • 通过读取源代码
经验主义的 时间到了
hd
it up

设置:

git init
echo a > b
git add b
然后:

给出:

00000000  44 49 52 43 00 00 00 02  00 00 00 01 54 e9 b6 f3  |DIRC........T...|
00000010  2d 4f e1 2f 54 e9 b6 f3  2d 4f e1 2f 00 00 08 05  |-O./T...-O./....|
00000020  00 de 32 ff 00 00 81 a4  00 00 03 e8 00 00 03 e8  |..2.............|
00000030  00 00 00 00 e6 9d e2 9b  b2 d1 d6 43 4b 8b 29 ae  |...........CK.).|
00000040  77 5a d8 c2 e4 8c 53 91  00 01 62 00 c9 a2 4b c1  |wZ....S...b...K.|
00000050  23 00 1e 32 53 3c 51 5d  d5 cb 1a b4 43 18 ad 8c  |#..2S<Q]....C...|
00000060
00000000  44 49 52 43 00 00 00 02  00 00 00 01 54 e9 b6 f3  |DIRC........T...|
00000010  2d 4f e1 2f 54 e9 b6 f3  2d 4f e1 2f 00 00 08 05  |-O./T...-O./....|
00000020  00 de 32 ff 00 00 81 a4  00 00 03 e8 00 00 03 e8  |..2.............|
00000030  00 00 00 00 e6 9d e2 9b  b2 d1 d6 43 4b 8b 29 ae  |...........CK.).|
00000040  77 5a d8 c2 e4 8c 53 91  80 01 62 00 17 08 a8 58  |wZ....S...b....X|
00000050  f7 c5 b3 e1 7d 47 ac a2  88 d9 66 c7 5c 2f 74 d7  |....}G....f.\/t.|
00000060
给出:

00000000  44 49 52 43 00 00 00 02  00 00 00 01 54 e9 b6 f3  |DIRC........T...|
00000010  2d 4f e1 2f 54 e9 b6 f3  2d 4f e1 2f 00 00 08 05  |-O./T...-O./....|
00000020  00 de 32 ff 00 00 81 a4  00 00 03 e8 00 00 03 e8  |..2.............|
00000030  00 00 00 00 e6 9d e2 9b  b2 d1 d6 43 4b 8b 29 ae  |...........CK.).|
00000040  77 5a d8 c2 e4 8c 53 91  00 01 62 00 c9 a2 4b c1  |wZ....S...b...K.|
00000050  23 00 1e 32 53 3c 51 5d  d5 cb 1a b4 43 18 ad 8c  |#..2S<Q]....C...|
00000060
00000000  44 49 52 43 00 00 00 02  00 00 00 01 54 e9 b6 f3  |DIRC........T...|
00000010  2d 4f e1 2f 54 e9 b6 f3  2d 4f e1 2f 00 00 08 05  |-O./T...-O./....|
00000020  00 de 32 ff 00 00 81 a4  00 00 03 e8 00 00 03 e8  |..2.............|
00000030  00 00 00 00 e6 9d e2 9b  b2 d1 d6 43 4b 8b 29 ae  |...........CK.).|
00000040  77 5a d8 c2 e4 8c 53 91  80 01 62 00 17 08 a8 58  |wZ....S...b....X|
00000050  f7 c5 b3 e1 7d 47 ac a2  88 d9 66 c7 5c 2f 74 d7  |....}G....f.\/t.|
00000060
通过比较这两个指数并查看,可以看出唯一的区别是:

  • 字节号
    0x48
    (第9行
    40
    )从
    00
    更改为
    80
    这是我们的标志,缓存项标志的第一位
  • 0x4C
    0x5F
    的20个字节。这是预期的,因为这是整个指数的SHA-1
尽管如此,从
0x34
0x47
的索引项的SHA-1(以字节为单位)没有考虑标志,因为它在两个索引之间没有更改。这可能就是为什么旗帜放在SHA后面,而SHA只考虑前面的内容

源代码 现在让我们看看这是否与Git2.3的源代码一致

首先看一下的源代码,grep
假定未更改

这导致:

因此,该值存储在
标记\u valid\u only
处。Grep它,并发现它仅用于:

CE
表示缓存条目

通过快速检查,我们发现:

if (mark)
  active_cache[pos]->ce_flags |= flag;
else
  active_cache[pos]->ce_flags &= ~flag;
因此,该函数基本上设置或取消设置
CE\u VALID
位,具体取决于
mark\u VALID\u only
,这是一种三态:

  • 标记:
    --假定未更改
  • 取消标记:
    --不假设未更改
  • 不执行任何操作:在
    {option\u set\u INT,0
接下来,通过在
builtin/
下进行grepping,我们看到没有其他地方设置
CE\u VALID的值,因此
--假设unchanged
必须是唯一设置该值的命令

但是,该标志在源代码的许多地方都使用,这是意料之中的,因为它有许多副作用,并且每次都使用它,如:

ce->ce_flags & CE_VALID
因此,我们得出结论,它是的
ce_flags
字段的一部分

索引是在
cache.h
处指定的,因为它的一个功能是作为缓存以更快地创建提交

通过查看
CE\u VALID
的定义,我们有:

#define CE_STAGEMASK (0x3000)
#define CE_EXTENDED (0x4000)
#define CE_VALID (0x8000)
#define CE_STAGESHIFT 12

因此我们得出结论,它是该整数的第一位(
0x8000
),就在
CE_EXTENDED
旁边,它与一致。

您可以编辑它…使用
git ls files-s
转储索引;
git update index--index info
更新它。这在
git update index
手册页中…这有点复杂,您不应该触摸它。@J-16 SDiZ OP说
我喜欢修改它直接配置文件(如.gitignore和.git/config),而不是记住任意命令
谢谢你提供的信息。二进制格式有点不幸(尽管非常有效)。这解释了为什么我选择“假定不更改”生成文件,下次我执行生成过程时它将恢复正常。@manojlds OP可能希望直接修改配置文件,但
git
索引绝对不是配置文件。@cottsak-索引是
.git/index
处的文件,而不是整个
.git
目录。“索引主目录”;+1
ce->ce_flags & CE_VALID
#define CE_STAGEMASK (0x3000)
#define CE_EXTENDED (0x4000)
#define CE_VALID (0x8000)
#define CE_STAGESHIFT 12