【发布时间】:2012-01-24 16:50:21
【问题描述】:
我想修改一个(文本)文件的索引,而不必更改工作树文件的状态。这可能吗?
【问题讨论】:
我想修改一个(文本)文件的索引,而不必更改工作树文件的状态。这可能吗?
【问题讨论】:
“在不改变工作目录的情况下更改索引中的文件”的另一种做法是仅对索引应用补丁。这通常是 GUI git 客户端仅暂存给定文件中选定行的方式。
您首先(如果需要)从该文件的索引中清除更改:
git reset path/to/file
然后为它提取完整的补丁
git diff path/to/file > /path/to/tmpfile
编辑补丁文件以仅包含您要应用的更改,并仅应用编辑后的补丁:
git apply --cached /path/to/tmpfile
见:
git help apply
【讨论】:
是的,您可以在 any 的 git 级别上使用 --work-tree 选项(这实际上不是真的。它应该适用于任何但有边缘情况)命令:
git show HEAD:path/to/your/file.txt > /some/other/place/file.txt
# modify the file in /some/other/place/file.txt
git --work-tree=/some/other/place add /some/other/place/file.txt
【讨论】:
--work-tree 选项的 Git 命令到底是做什么的?需要什么 Git 版本?提供的路径是否应该始终是添加文件的父目录?
--work-tree 选项告诉 git 命令使用提供的备用目录作为工作目录执行。这允许您不影响您的工作目录。这应该在所有 Git 版本上都可用,除非你有一些非常旧的东西。工作树选项于 2007 年 6 月推出。目录可以是您喜欢的任何内容,但通常位于当前工作树之外。为什么要求工作目录中的文件不被更改?
pwd 打印并由cd 修改的东西。在这种情况下你是什么意思?
是的,您可以使用 git update-index 在特定路径上显式暂存 blob。
git update-index --cacheinfo 100644 <sha1-of-blob> path/in/repo
如果路径是分支新文件,您还需要使用--add。
如果您要暂存的文件是 git 存储库中尚不存在的 blob,则您可以使用 git hash-object 在 git 存储库中存储一个新 blob,例如:
blobid=$(command_that_creates_output | git hash-object -w --stdin)
或
blobid=$(git hash-object -w /path/not/necessarily/in/repository)
然后您可以按上述方式暂存 blob。
git update-index --cacheinfo 100644 blobid path/in/repo
【讨论】: