Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“在哪里?”;git更新索引--假定文件未更改;是否将此信息保存到?_Git_Git Index - Fatal编程技术网

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

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

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


如果你知道,请告诉我

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

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


另外,要详细了解git update index--Aspect unchanged命令中存储的内容,请参阅使用“Aspect unchanged”位的

命令中的位置-gitupdate index

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


另外,要详细说明使用
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\u
,它与一致。

正如其他人所说,它存储在位于
.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的值,所以