“在哪里?”;git更新索引--假定文件未更改;是否将此信息保存到?
我喜欢直接修改配置文件(如.gitignore和.git/config),而不是记住任意命令,但我不知道git将传递到“git更新索引--假定未更改文件”的文件引用存储在哪里“在哪里?”;git更新索引--假定文件未更改;是否将此信息保存到?,git,git-index,Git,Git Index,我喜欢直接修改配置文件(如.gitignore和.git/config),而不是记住任意命令,但我不知道git将传递到“git更新索引--假定未更改文件”的文件引用存储在哪里 如果你知道,请告诉我 它显示命令中的位置-git更新索引 因此,您不能真正编辑索引,因为它不是文本文件 另外,要详细说明使用git update index--assession unchanged命令存储的内容,请参阅使用“assession unchanged”位的,正如其他人所说,它存储在位于.git/index的索
如果你知道,请告诉我 它显示命令中的位置-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
通过比较这两个指数并查看,可以看出唯一的区别是:
- 字节号
(第9行0x48
)从40
更改为00
这是我们的标志,缓存项标志的第一位80
- 从
到0x4C
的20个字节。这是预期的,因为这是整个指数的SHA-10x5F
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