【问题标题】:Git: ability to stage a certain file content without touching the working treeGit:能够在不接触工作树的情况下暂存某个文件内容
【发布时间】:2012-01-24 16:50:21
【问题描述】:

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

【问题讨论】:

    标签: git stage


    【解决方案1】:

    “在不改变工作目录的情况下更改索引中的文件”的另一种做法是仅对索引应用补丁。这通常是 GUI git 客户端仅暂存给定文件中选定行的方式。

    您首先(如果需要)从该文件的索引中清除更改:

    git reset path/to/file
    

    然后为它提取完整的补丁

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

    编辑补丁文件以仅包含您要应用的更改,并仅应用编辑后的补丁:

    git apply --cached /path/to/tmpfile
    

    见:

    git help apply
    

    【讨论】:

      【解决方案2】:

      是的,您可以在 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 月推出。目录可以是您喜欢的任何内容,但通常位于当前工作树之外。为什么要求工作目录中的文件不被更改?
      • @AdamDymitruk 我怀疑您使用“工作目录”的含义与通常含义不同。通常,“工作目录”是指由pwd 打印并由cd 修改的东西。在这种情况下你是什么意思?
      • 在这种情况下,在 git 命令执行期间,将给定目录视为当前 repo 的工作文件夹。
      【解决方案3】:

      是的,您可以使用 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
      

      【讨论】:

      • 暂存的文件内容将来自临时(因此未版本化)文件(如有必要:来自工作树内)。
      • @MikeL:没关系,当我说“路径/外部/存储库”时,我的真正意思是“不一定在存储库中”。
      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2011-10-29
      • 2016-06-25
      • 2022-12-17
      • 1970-01-01
      • 2018-08-06
      相关资源
      最近更新 更多