git - 我如何 git 仅添加与模式匹配的行?

标签 git git-add

我正在使用 git 跟踪一些配置文件。我通常会执行交互式 git add -p 但我正在寻找一种方法来自动添加与模式匹配的所有新的/修改的/删除的行。否则,我将花费很长时间来完成所有交互式拆分和添加。 git add 有一个文件名模式匹配,但我找不到有关内容的任何信息。

最佳答案

这里有一个方法:

  1. 使用 git diff > patch 为当前差异打补丁。

  2. 使用 gawk 仅对匹配模式的 +/- 行制作第二个补丁:从删除的行中删除 - 不匹配模式,删除 + 不匹配模式的行,修改 hunk 标题行号,输出每个修改后的 hunk,但不要输出任何修改后的 hunk,它们不再有任何变化。

  3. 使用git stash saveapply patchadd -u,和stash pop到应用并暂存修改后的补丁,不暂存其余更改。

这适用于多个测试用例,它一次适用于整个差异(所有文件),而且速度很快。

#!/bin/sh

diff=`mktemp`
git diff > $diff
[ -s $diff ] || exit

patch=`mktemp`

gawk -v pat="$1" '
function hh(){
  if(keep && n > 0){
    for(i=0;i<n;i++){
      if(i==hrn){
        printf "@@ -%d,%d +%d,%d @@\n", har[1],har[2],har[3],har[4];
      }
      print out[i];
    }
  }
}
{
  if(/^diff --git a\/.* b\/.*/){
    hh();
    keep=0;
    dr=NR;
    n=0;
    out[n++]=$0
  }
  else if(NR == dr+1 && /^index [0-9a-f]+\.\.[0-9a-f]+ [0-9]+$/){
    ir=NR;
    out[n++]=$0
  }
  else if(NR == ir+1 && /^\-\-\- a\//){
    mr=NR;
    out[n++]=$0
  }
  else if(NR == mr+1 && /^\+\+\+ b\//){
    pr=NR;
    out[n++]=$0
  }
  else if(NR == pr+1 && match($0, /^@@ \-([0-9]+),?([0-9]+)? \+([0-9]+),?([0-9]+)? @@/, har)){
    hr=NR;
    hrn=n
  }
  else if(NR > hr){
    if(/^\-/ && $0 !~ pat){
      har[4]++;
      sub(/^\-/, " ", $0);
      out[n++] = $0
    }
    else if(/^\+/ && $0 !~ pat){
      har[4]--;
    }
    else{
      if(/^[+-]/){
        keep=1
      }
      out[n++] = $0
    }
  }
}
END{
  hh()
}' $diff > $patch

git stash save &&
  git apply $patch &&
  git add -u &&
  git stash pop

rm $diff
rm $patch

引用:

git diff apply

unified diff format

gawk match groups to array

git add -u

关于git - 我如何 git 仅添加与模式匹配的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36932309/

相关文章:

Git 克隆错误 : index-pack died of signal 9

ios - 为什么 git add -A 不添加我所有的 png 文件?

git - Jenkins - 无法在子模块路径 'submodule-project' 中找到当前的原始/开发版本

git - 从 Bitbucket 克隆到本地 Android Studio 项目

php - 在 CentOS 上为 Apache 用户创建 SSH key

git - 运行 'git-add' 后发出的正确 'git-mergetool' 命令是什么?

git - 从 Git 存储库中删除多个已从磁盘中删除的文件

git - 如何恢复添加到 git 但被 checkout 覆盖的文件

git - 在交互式 rebase 期间如何执行 git add --patch?

git - 使用 Git 只获取子目录?