我想能够在编辑器中选择行并运行宏,将选择中的任何更改添加到索引中。
git hash-object -w $tempfile
。这将把对象写入.git/objects并输出blob id。然后使用git update-index --cacheinfo 100644 $blobid $path
将这个blob id传给索引,以将路径$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
(获取$the_mode留作练习 :p),删除$file.tmp并将编辑器缓冲区恢复为$file,那基本上就达到了您所要求的效果。
例如,以下脚本接受三个参数:M N path
。它将更新路径下的文件的索引内容,以便将第M行至第N行(包括这两行)替换为stdin中的内容:
#!/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 行的三行。
git add
命令:git add -i path/to/file
它将启动简单的用户界面,您可以在其中选择要暂存的块,并允许您编辑任何块以删除不想提交的行。
H
键。这确实需要从常规编辑器切换到 git-cola 进行暂存,但两者可以同时运行,我并没有觉得不方便。 - Roger Dahl最接近此功能的预构建工具是git gui citool
。它不能直接在您的编辑器中使用(并非所有编辑器都有有用的差异视图,我认为大多数人可能不关心记住自上次提交以来确切更改了哪些行,因此差异视图非常有用),但似乎接近您想要的。
git gui citool
允许您在与git diff --cached
和git diff
等效的视图中查看已暂存和未暂存的更改。
在查看未暂存的更改时,上下文菜单(右键单击)提供选项以将所选行(或如果没有选择,则单击行)暂存,并提供一个选项以暂存整个块。 同样,在查看已暂存的更改时,上下文菜单提供选项以取消暂存行或块。
要获取更多上下文信息,可以使用“显示更多上下文”菜单项(如果要缩小块,则使用“显示更少上下文”)。
一旦您的新内容已暂存,您还可以从GUI内部组合提交消息并进行提交。
我想有些人会像这样使用git gui
的工作流程:
git add
的各种选项)。git gui
中,选择“重新扫描”,查看更改,对一些进行暂存/取消暂存,最终提交它们。
git add -i
完成更有兴趣吗?如果你真的想要,你可以编写一些调用git diff
的代码,提取与你选择的行相关的 hunks,并将该补丁应用到索引中... - Cascabel