代码之家  ›  专栏  ›  技术社区  ›  RobM

Git:通过行号将部分(更改的)文件添加到索引*中*

git
  •  7
  • RobM  · 技术社区  · 14 年前

    是否有git命令来添加差异 在行号范围内 到索引?

    4 回复  |  直到 14 年前
        1
  •  17
  •   araqnid    14 年前

    如果您可以说服编辑器编写要暂存的文件的版本,那么可以使用管道级git命令将其添加到正确名称下的索引中。您需要绕过“git add”,它总是将工作树中的路径X与索引中的路径X相关联(据我所知)。

    git hash-object -w $tempfile -这将把对象写入.git/objects并输出blob id。然后使用 git update-index --cacheinfo 100644 $blobid $path 将路径$path与该对象关联。

    git update-index --cacheinfo 100755 $(perl -lne 'print unless (/^#/)' post_load \
                                          | git hash-object -w --stdin) post_load
    

    您没有提到您计划从哪个编辑器执行此操作,因此很难建议您如何集成此功能。正如我所提到的,您需要以某种方式将git与文件一起呈现,因为您希望它被暂存(记住,git不处理存储更改)。如果您可以编写一个宏来将文件保存为“$file.tmp”,那么可以使用上面的方法 git update-index --cacheinfo $the_mode $(git hash-object -w $file.tmp) $file

    例如,以下脚本采用三个参数: M N path . 它将更新“path”处文件的索引内容,以便用stdin中的内容替换第M行到第N行(包括第N行):

    #!/bin/sh
    
    start_line=$1
    end_line=$2
    path=$3
    
    mode=$(git ls-files -s $path | awk '{print $1}')
    blob_id=$(
        (
            head -n $(expr $start_line - 1) $path
            cat
            tail -n +$(expr $end_line + 1) $path
            ) | git hash-object -w --stdin
        )
    exec git update-index --cacheinfo $mode $blob_id $path
    

    例如 echo "HELLO WORLD" | ./stage-part 8 10 post_load 将用“HELLO WORLD”替换8-10之间的三行。

        2
  •  3
  •   Bartosz    14 年前

    目前最简单的方法是使用 git add 在交互模式下:

    git add -i path/to/file
    

        3
  •  2
  •   allentiak    9 年前

    以我自己的经验, git-cola 在这方面做得很好。我希望它支持原子集成。。。

        4
  •  0
  •   Chris Johnsen    14 年前

    最接近的预构建工具是 git gui citool . 它不能直接在编辑器中工作(不是所有的编辑器都有有用的diff视图,而且我怀疑大多数人可能不想确切地记住自上次提交以来更改了哪些行,因此diff视图非常有用),但是它似乎很接近您想要的。

    用于查看视图中与 git diff --cached git diff 分别是。

    在查看未暂存的更改时,上下文菜单(右键单击)具有暂存选定行的选项(如果没有选择,则为单击的行)和暂存整个大块的选项。 同样地,在查看阶段性更改时,上下文菜单也可以选择取消行或块的阶段性更改。

    一旦您准备好了新内容,您还可以编写提交消息并从GUI内部进行提交。

    我想有些人 git gui 在这样的工作流中:

    1. 使用CLI添加新的跟踪文件并删除旧文件 git add ).
    2. 在您喜爱的编辑器/环境中编辑跟踪的文件。
    3. git图形用户界面