git中是否有一种方法可以执行与2个shell命令相同的操作:
touch somefile
git add somefile
在一个命令中?
答案 0 :(得分:4)
git add
将文件从工作树复制到索引中。此过程要求文件存在; git add
将在索引中使用相同的名称。
从技术上讲,git add
的真正作用包括两个步骤:
它必须在存储库数据库中创建或找到包含文件的内容的 blob 对象。如果文件为空,则进入数据库或已经存在于数据库中的对象具有以下哈希值:
$ git hash-object -t blob --stdin < /dev/null
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
您可以通过运行带有git hash-object
标志的-w
来模拟这一点,该标志告诉Git如果需要的话将该对象写入数据库,然后返回代表这些内容的哈希ID。
现在该对象在数据库中(如有需要,可以重新写入),并且拥有其哈希ID,git add
继续更新索引。此更新包括删除具有相同名称的所有更高阶段的条目,并写入零阶段条目。输入内容是文件所需的 mode -如果应将文件标记为读/写,则为100644
;如果应将文件标记为读/写/执行,则为100755
。 ,阶段号(零),blob哈希ID和路径(以UTF-8字符串表示)。
您可以使用git update-info
完成第二步,可以使用--index-info
(从标准输入读取)或--cacheinfo
(限于编写零级条目,但这就是事实)无论如何你都想要)。有关详细信息,请参见the git update-index
documentation。
执行此操作而不是touch file; git add file
的问题是,除非您已经知道内容的哈希ID,并且和该哈希ID实际上在在Git数据库中,它仍然需要两个命令:git hash-object -w ...
和git update-index ...
。在这种情况下,您最好改用简单的命令。
(请注意,尽管所有存储库都具有empty tree,但它们最初并不具有空blob 。)