【问题标题】:Git command to programatically add a range of lines of a file to the index?Git命令以编程方式将文件的一系列行添加到索引?
【发布时间】: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


    【解决方案1】:

    您可以利用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 脚本 - 它必须解析差异并取消选择不属于目标范围的块。

    【讨论】:

      【解决方案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. 仅将补丁应用于索引,因为工作目录已包含更改。

      【讨论】:

      • OP 没有精确地指定大块选择标准。据我了解,一个大块可能比规定的行范围更大(大块只需要完全包含这些行)。当指定的行范围是大块的子集时,您的解决方案将生成部分补丁。
      • 此外,我认为您的git log 命令缺少-1 选项。
      • @Leon,“当指定的行范围是大块的子集时,您的解决方案将生成部分补丁。” - 嗯,这正是我的理解,OP 想要精确地指定包含大块的行的范围。
      • OP 通过git add -p 的解释不同 - 如果包含第 10-20 行的块实际上是 100 行长,则将选择整个块。
      • 我建议将git add \"$1\" && git commit -m temp 替换为git commit -m temp \"$1\",以便其他可能分阶段的更改不会包含在一次性提交中。
      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多