2010-05-06 24 views
6

是否有git命令将行号范围内的差异添加到索引?Git:通过行号将索引*的部分文件添加到索引*

我希望能够在我的编辑器中选择行并运行一个宏,以将所选内容的任何更改添加到索引中。

+0

你是如何附加在编辑器中执行此操作的想法,而不是通过'git add -i'?如果你真的想要... – Cascabel 2010-05-06 18:01:39

回答

17

如果您可以说服您的编辑器编写想要分阶段执行的文件版本,则可以使用管道级别的git命令以正确的名称将其添加到索引中。你需要绕过“git add”,它始终将工作树中的路径X与索引中的路径X相关联(据我所知)。

一旦你想要将内容写入临时文件$ tempfile,运行git hash-object -w $tempfile - 这会将对象写入.git/objects并输出blob id。然后使用git update-index --cacheinfo 100644 $blobid $path将此Blob ID提供给索引,以将路径$ path与该对象相关联。

这里是一个阶段的变化,以一个在我的回购称为“post_load”的剧本,但不覆盖文件本身(也表明你可以不用临时文件做)的一个例子:

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并恢复编辑器缓冲区回到$文件,这基本上会做你想要的东西。

例如,以下脚本需要三个参数:M N path。将在“路径”更新该文件的索引内容,以便线M1至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将与替换三条线从8-10只是“HELLO WORLD”。

3

做到这一点目前最简单的方法是在交互模式git add

git add -i path/to/file 

将推出简单的用户界面,你可以选择你想上演块,让你编辑任何块删除线你不不想承诺。

+0

这是我目前的做法,你可以设计一些叫做'git diff'的东西,将接触到你所选择的线条的快捷键拉出来,但是当diff中有很多“噪声”时,我想测试/提交,我感到困惑(由于缺少上下文行等)。 真的想在这种情况下能够从我的编辑驱动器。 – RobM 2010-05-06 18:10:46

0

与此类似的最接近的预建工具是git gui citool。它不直接在你的编辑器中工作(并不是所有的编辑器都有有用的差异视图,我怀疑大多数人可能并不在乎自己是否记得自上次提交以来他们已经改变了哪些行,所以差异视图非常有用),但似乎就像它接近你想要的一样。

git gui citool允许您分别查看分别等效于git diff --cachedgit diff的视图中的分阶段和非分离更改。

查看未分离的更改时,上下文菜单(右键单击)可以选择分段选定的行(或者如果没有选择,则单击的行)以及分段整个分块的选项。 同样,当审查分阶段更改时,上下文菜单可以选择将行或空格删除。

要获得更多的上下文,可以使用“显示更多上下文”菜单项(或“如果想缩小人群时显示更少上下文”)。

一旦你有了新的内容,你也可以编写你的提交信息并在GUI中进行提交。

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

  1. 使用CLI(各种选项git add)添加新的被跟踪文件并删除旧文件。
  2. 编辑您最喜爱的编辑器/环境中的跟踪文件。
  3. git gui中,选择“重新扫描”,检查更改,阶段/取消某些,并最终提交它们。
  4. [重复]
2

在我自己的经验,git-cola确实对这个非常出色。我希望它支持Atom集成...

+0

虽然这可能在理论上回答这个问题,[这将是更可取的](/ meta.stackoverflow.com/q/8259)在这里包括答案的基本部分,并提供链接供参考。 – manetsus 2016-03-18 02:04:48

+0

在git-cola中,选择线条并从下拉列表中选择“Stage Selected Lines”,或点击“H”。它确实需要从常规编辑器切换到git-cola进行登台,但两者都可以同时运行,但我不觉得这很不方便。 – 2016-06-27 19:11:17