我有一个重命名文件的问题,并给了一个解决方案,其中包括两个git命令 - git read-tree -i HEAD和git checkout-index -a -f.我似乎已经弄明白第二个人做了什么并对其进行了测试,但我无法理解为什么即使对于最简单的情况我也需要第一个.我认为它可以以某种方式替换git add命令并添加文件到索引,但是当我创建一个新文件并运行命令然后检查索引的内容时ls-files --staged它没有显示这些文件添加,所以可能我的假设命令的目的是错误的.我也访问了手册页,但仍然不明白为什么我需要这个命令.
git read-tree 是这样的:
解析传递给它的"tree-ish"以找到存在于描述树的Git存储库中的对象.
树代表Git中的目录:这种对象列出了包含树的blob(文件)和嵌套树(嵌套目录)的SHA-1和文件系统名称.每个提交只引用一个树,它代表顶级项目目录本身的状态.
"tree-ish"是Git能够解析为树对象名称的规范.例如,HEAD首先将其解析为引用的名称,然后将其指向的分支追逐以获取其提示,然后对其进行解析以获取其树对象的名称.
以递归方式读取获取的树对象,并使用有关这些对象的信息填充索引.索引不包含有关它们的仅文件元信息的实际数据.
IOW,索引就像一个保存在单个文件中的微型文件系统.它的格式经过优化,可以通过巨大的嵌套文件集进行超快速访问.
现在,另一个命令git checkout-index可用于使工作树与索引同步.这样的命令就是git checkout <commit>这样:调用git read-tree填充索引,然后git checkout-index将工作树与它同步.
这是基础知识.该命令可以做更多:
-m命令行选项,它就能够将传递给它的树合并到索引中.--prefix).--empty).在最简单的形式中,当我们处理您的原始问题时,我们已经调用它,它只是用当前引用的内容替换了索引的内容HEAD.
请注意,这git read-tree是一个管道命令,不打算由用户常规使用.当你做这样的事情时会自动调用它git checkout <commit>.我建议直接调用它,因为谁知道运行git checkout HEAD是否真的会更新你的索引,或者它会决定,因为它无论如何反映了HEAD应该做的事情的状态.手动调用确保索引开始包含我们所需的状态.在一般情况下,您不需要此程序,因此这就是为什么很难想出一个简单的用法示例.
| 归档时间: |
|
| 查看次数: |
5523 次 |
| 最近记录: |