Git:能够在不影响工作目录的情况下暂存特定文件内容的能力

4

我想修改一个(文本)文件的索引,而不必更改工作树文件状态。 这可能吗?

3个回答

2
另一种“在不改变工作目录的情况下更改索引文件”的方法是仅对索引应用补丁。这通常是GUI git客户端从给定文件中仅暂存选定行的方式。
您可以通过清除该文件的索引更改(如果需要)来开始:
git reset path/to/file

然后提取其完整补丁

git diff path/to/file > /path/to/tmpfile

编辑补丁文件,只包含你想要应用的更改,并仅应用已编辑的补丁。
git apply --cached /path/to/tmpfile

请参见:

git help apply

1
是的,你可以在任何 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?提供的路径是否总是添加文件的父目录? - Mot
“--work-tree”选项告诉git命令使用提供的替代目录作为工作目录来执行。这样可以使您的工作目录不受影响。除非您使用的是非常旧的版本,否则此选项应该在所有Git版本中都可用。Work-tree选项于2007年6月引入。目录可以是任何您喜欢的东西,但通常会在当前工作树之外。为什么需要在工作目录中的文件不被更改? - Adam Dymitruk
1
@AdamDymitruk 我怀疑你使用的“工作目录”与其通常意义不同。通常,“工作目录”是由pwd打印并由cd修改的内容。在这种情况下,你指的是什么? - Laurence Gonsalves
在这种情况下,对于 git 命令的持续时间,将给定的目录视为当前 repo 的工作文件夹。 - Adam Dymitruk

1

是的,您可以使用git update-index在特定路径上明确地暂存一个blob。

git update-index --cacheinfo 100644 <sha1-of-blob> path/in/repo

如果路径是一个全新的文件,您还需要使用--add

如果要暂存的文件是一个在Git仓库中不存在的blob,则可以使用git hash-object将新的blob存储在Git仓库中,例如:

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

要暂存的文件内容将来自于临时文件(因此未经版本控制)(如果必要:从工作树内部)。 - Mot
@MikeL:这也可以,当我说“路径/外部/存储库”时,我的意思是“不一定在存储库中”。 - CB Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接