【发布时间】:2016-10-21 06:26:10
【问题描述】:
我想要一个可以让我执行以下操作的命令:
git manual-add some_file.txt 10..20
相当于:
git add -p some_file.txt
并且只对包含第 10 到 20 行的大块说 y。
是否有一个内部 git 命令可以让我这样做?有任何方法可以做到吗?
【问题讨论】:
标签: git
我想要一个可以让我执行以下操作的命令:
git manual-add some_file.txt 10..20
相当于:
git add -p some_file.txt
并且只对包含第 10 到 20 行的大块说 y。
是否有一个内部 git 命令可以让我这样做?有任何方法可以做到吗?
【问题讨论】:
标签: git
您可以利用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 脚本 - 它必须解析差异并取消选择不属于目标范围的块。
【讨论】:
为您的配置添加别名:
[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
这个序列将:
ptc.patch。【讨论】:
git log 命令缺少-1 选项。
git add -p 的解释不同 - 如果包含第 10-20 行的块实际上是 100 行长,则将选择整个块。
git add \"$1\" && git commit -m temp 替换为git commit -m temp \"$1\",以便其他可能分阶段的更改不会包含在一次性提交中。