在.git/index文件上最细粒度的操作是什么?
某些在.git/index文件上最细粒度的操作是什么?,git,Git,某些git命令,如git add…修改.git/index文件的状态,但我认为一些这样的操作可能被认为是一系列较小的操作。比如说, git add foo bar 可分解为 git add foo git add bar 事实上,可能有(据我所知),上面的命令甚至可以分解为“细粒度”(但仍然是“.git/index-modifying”)git命令 我的问题是,使用git命令可以对.git/index文件执行哪些最细粒度的修改?那么,.git/index上的“原子”命令行操作是什么 我认为所
git
命令,如git add…
修改.git/index
文件的状态,但我认为一些这样的操作可能被认为是一系列较小的操作。比如说,
git add foo bar
可分解为
git add foo
git add bar
事实上,可能有(据我所知),上面的命令甚至可以分解为“细粒度”(但仍然是“.git/index
-modifying”)git
命令
我的问题是,使用git
命令可以对.git/index
文件执行哪些最细粒度的修改?那么,.git/index
上的“原子”命令行操作是什么
我认为所有这些命令都是管道命令。另外,如果让我猜的话,我会想象gidadd
和gitrm--cached
将近似于其中的两个操作。另一方面,git mv
可能是“原子”删除和“原子”添加的组合
编辑:这个问题的动机如下
我发现,git
行为中最令人困惑的方面是那些导致修改.git/index
文件的方面。其他所有关于git的内容都更容易检查。然而,.git/index
文件非常不透明
出于这个原因,我想更好地了解
.git/index
文件是如何被修改的。一般来说,git只不过是一个复杂的键值存储,它本质上具有存储在树中的对象blob
您可能想阅读从官方Git内部文档中获取的信息,以确切了解它是如何组合在一起的
具体来说,关于你的问题:
。。。当您运行Git add
和Git commit
命令时,Git所做的是什么?它为已更改的文件存储blob,更新索引,写出树,并写入引用顶级树和紧接它们之前的提交的提交对象
主索引由多个索引项组成,项集合表示下一次提交的内容。当您添加文件时,它会为给定文件名添加(或更新)索引项 索引项本身包含多个字段,这些字段既与分段更改(对象ID和模式)有关,也与工作目录中的内容(时间戳、文件大小等)有关。您可以使用
git ls files
命令查看这两个文件:
C:\Temp\TestRepo>git add file.txt
C:\Temp\TestRepo>git ls-files --stage
100644 9b72baa6b025e0eb1dd8f1fd23bf5d5515012cd6 0 file.txt
C:\Temp\TestRepo>git ls-files --debug
file.txt
ctime: 1391645170:0
mtime: 1391645172:0
dev: 0 ino: 0
uid: 0 gid: 0
size: 7 flags: 0
一般来说,只需使用git add
和git rm
命令即可添加、更新和删除主索引中的条目。但是,某些命令将仅更新部分索引项。例如,git checkout
和git status
将写入索引项的工作目录缓存内容。例如:
C:\Temp\TestRepo>touch file.txt
C:\Temp\TestRepo>git status
# On branch master
nothing to commit, working directory clean
C:\Temp\TestRepo>git ls-files --debug
file.txt
ctime: 1391645170:0
mtime: 1391645458:0
dev: 0 ino: 0
uid: 0 gid: 0
size: 7 flags: 0
(注意索引项中更新的mtime
(修改的时间)字段)
您可以在单个命令中对索引进行的最小单个更改是翻转文件上的“假定未更改”位:
C:\Temp\TestRepo>git update-index --assume-unchanged file.txt
C:\Temp\TestRepo>git ls-files --debug
file.txt
ctime: 1391645170:0
mtime: 1391645458:0
dev: 0 ino: 0
uid: 0 gid: 0
size: 7 flags: 8000
(注意,标志
字段从0x0000更改为0x8000,翻转一位。)