没有其他选项的“git update-index -g”究竟是什么呢?

时间:2016-09-13 20:33:09

标签: git

我一直在查看git update-index的手册页。我只是不明白传递-g时它的作用。该选项选择已在索引中与HEAD不同的文件。但是对这些文件做了什么?

关于网络的很多讨论都是--assume-unchanged,但我想了解基本功能。

P.S。:我想我确实理解索引是做什么的,git addgit reset是如何工作的。

1 个答案:

答案 0 :(得分:2)

从我对手册页的阅读中,它什么也没做。这是因为:

   Modifies the index or directory cache. Each file mentioned is updated
   into the index and any unmerged or needs updating state is cleared.

"每个文件"如果没有文件参数,则为空集,并且我无法找到为空案例分配特殊语义的任何地方。

但是,git update-index会检查它是否在Git仓库中:

~$ git update-index
fatal: Not a git repository (or any of the parent directories): .git
~$ echo $?
128

因此,没有参数的git update-index至少执行完整性检查并提供错误消息和终止状态。如果它真的什么也不做,它可以在脚本中用于检查它们是否在git repo中。请注意,其他命令如git rev-parse也可以没有参数。

如果通过"没有参数"你的意思是"没有选项,但是文件参数存在" ,那么它所做的就是对那些已经存在于git中的指定文件执行操作。当遇到文件参数(未跟踪文件)时,它会给出错误诊断,因为未指定--add。它以终止状态失败退出,索引未修改。

所以基本上没有选项它提供了一个健全性检查:要么它能够对所有指定的文件进行操作,要么它保释并且什么都不做。这可以防止意图仅对跟踪文件进行操作时的情况。

-g/--again 的目的是提供一种方法,通过修改,对已经上演的文件重复git update-index。它对这些文件的作用是再次更新它们,以便索引与工作副本匹配。

您可能会遇到HEAD提交,暂存索引和工作副本中给定文件不同的情况。当您破解文件,然后使用git add(或git update-index)进行分段时会发生这种情况,此时索引与工作副本相同;然后你再次破解它。现在它与索引不同,这与HEAD不同。通过再次将其更新为索引,您可以将索引与工作副本同步,因此唯一不同的是HEAD

请注意,执行git diff时,会将工作文件与索引进行比较。要查看索引到HEAD的差异,请执行git diff --cached和使用git diff HEAD。因此,你破解了一个文件,然后将其暂存,然后再次破解它,git diff将向你显示分阶段和工作之间的最新黑客。原始hack为git diff --cached,整体组合黑客为git diff HEAD。有了这个,你可以探索git update-index的影响。

似乎-g对文件参数很有用:git update-index -g file-j file-k表示"对所有已经进行了修改的内容进行update-index在新近被攻击的file-jfile-k上执行此操作。"