【问题标题】:Create new file and add it to git version control in one command在一个命令中创建新文件并将其添加到 git 版本控制
【发布时间】:2019-02-25 21:41:33
【问题描述】:

在 git 中有没有办法像 2 个 shell 命令一样做同样的事情:

touch somefile
git add somefile

在一个命令中?

【问题讨论】:

  • 什么时候写入文件?
  • 目标是什么?你尝试的没有意义......
  • 也许有一个看门狗脚本在检测到更改时触发git add somefile?或者touch somefile && git add somefile,如果这只是一次提交的问题。
  • 你可以是第一个写的;)。
  • 没有。 Git 跟踪现有 文件,并没有规定创建新文件。

标签: bash git shell


【解决方案1】:

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

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

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

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

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

  2. 现在对象已在数据库中(如果需要,可以重新编写)并且我们有了它的哈希 ID,git add 继续更新索引。此更新包括删除任何具有相同名称的更高阶段条目,并写入零阶段条目。条目内容是文件所需的模式——如果文件应该标记为读/写,则为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,但它们最初没有 empty blob。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2014-12-11
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多