使用一个命令创建新文件并将其添加到git版本控制中

时间:2019-02-25 21:41:34

标签: bash git shell

git中是否有一种方法可以执行与2个shell命令相同的操作:

touch somefile
git add somefile

在一个命令中?

1 个答案:

答案 0 :(得分:4)

git add将文件从工作树复制到索引中。此过程要求文件存在; git add将在索引中使用相同的名称。

从技术上讲,git add的真正作用包括两个步骤:

  1. 它必须在存储库数据库中创建或找到包含文件的内容 blob 对象。如果文件为空,则进入数据库或已经存在于数据库中的对象具有以下哈希值:

    $ git hash-object -t blob --stdin < /dev/null
    e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
    

    您可以通过运行带有git hash-object标志的-w来模拟这一点,该标志告诉Git如果需要的话将该对象写入数据库,然后返回代表这些内容的哈希ID。

  2. 现在该对象在数据库中(如有需要,可以重新写入),并且拥有其哈希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 。)