Git命令以编程方式将一系列文件行添加到索引中?

时间:2016-10-21 06:26:10

标签: git

我想要一个能让我做类似命令的命令:

git manual-add some_file.txt 10..20

这相当于:

git add -p some_file.txt

并且只对包含第10行到第20行的hunk说y

是否有内部git命令可以让我这样做?是否有任何方式可以完成?

2 个答案:

答案 0 :(得分:3)

您可以利用git add -e命令并将其作为编辑器传递给它一个脚本(在下面的示例中,它名为filterpatch),它将根据您的要求编辑补丁(请参阅git add文档中的"编辑补丁"部分:

EDITOR="filterpatch 10..20" git add -e some_file.txt

为方便起见,您可以按如下方式添加git别名:

git config alias.manual-add '!EDITOR="filterpatch $2" git add -e $1; :'

一个愚蠢的filterpatch脚本示例,该脚本在补丁的指定范围内为所有添加的行添加foo前缀:

#!/bin/bash -x

sed -i "$1 s/^+\([^+]\)/+foo \1/" "$2"

用法示例:

git manual-add some_file.txt 13,16

所以剩下的部分是关于正确实现filterpatch脚本 - 它必须解析差异并取消选择不属于目标范围的帅哥。

答案 1 :(得分:2)

为您的配置添加别名:

[alias]
        addp = "!sh -c 'git commit -m temp \"$1\" && git log -1 -u -L \"$2\":\"$1\" > ptc.patch && git reset HEAD^ && git apply --cached ptc.patch ' -"

现在你可以:

git addp a.txt 3,4

此序列将:

  1. 仅使用文件$ 1进行临时提交。
  2. 使用此问题的解决方案Git: discover which commits ever touched a range of lines为文件$ 1中的$ 2行编写补丁ptc.patch
  3. 混合重置临时提交。
  4. 仅将修补程序应用于索引,因为工作目录已包含更改。