Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.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/index文件上最细粒度的操作是什么?_Git - Fatal编程技术网

在.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,翻转一位。)