我正在使用 git 跟踪一些配置文件。我通常会执行交互式 git add -p
但我正在寻找一种方法来自动添加与模式匹配的所有新的/修改的/删除的行。否则,我将花费很长时间来完成所有交互式拆分和添加。 git add
有一个文件名模式匹配,但我找不到有关内容的任何信息。
最佳答案
这里有一个方法:
使用
git diff > patch
为当前差异打补丁。使用
gawk
仅对匹配模式的+/-
行制作第二个补丁:从删除的行中删除-
不匹配模式,删除+
不匹配模式的行,修改 hunk 标题行号,输出每个修改后的 hunk,但不要输出任何修改后的 hunk,它们不再有任何变化。使用
git stash save
,apply patch
,add -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 - 我如何 git 仅添加与模式匹配的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36932309/