发布
社区首页 >问答首页 >如何使用git -应用git单词diff

如何使用git -应用git单词diff
EN

Stack Overflow用户
提问于 2019-02-15 19:19:20
回答 1查看 531关注 0票数 8

我需要编辑一个凌乱的提交,它只更改了随后几行中的一个单词,保留了其中的一些更改并删除了其他更改。这些变化在git diff --word-diff中很容易看到,在这种格式下,我可以很容易地编辑这些块来完成我想要做的事情,但是现在我有了一个这样的文件

代码语言:javascript
代码运行次数:0
复制
diff --git a/cldf/forms.csv b/cldf/forms.csv
index 46c12a4..0374ece 100644
--- a/cldf/forms.csv
+++ b/cldf/forms.csv
@@ -1783,8 +1783,8 @@ ID,Lect_ID,Concept_ID,Form_according_to_Source,Form,Local_Orthography,Segments,C
1782,adan1251-lawah,day,dilɛlɛ,dilɛlɛ,dilele,d i l ɛ l ɛ,Lit. 'all day'.,datasets_Adang_Lawahing_tsv
1783,adan1251-lawah,day,wɛd saha,wɛd_saha,wed saha,w ɛ d _ s a h a,midday' lit. 'hot sun',datasets_Adang_Lawahing_tsv
1784,adan1251-lawah,morning,lalami,lalami,lalami,l a l a m i,,datasets_Adang_Lawahing_tsv
1785,adan1251-lawah,yesterday,ʔu:mi,ʔuːmi,[-umi-]{+'umi+},ʔ uː m i,,datasets_Adang_Lawahing_tsv
1786,adan1251-lawah,day_before_yesterday,ʔotariŋ alumi,ʔotariŋ_alumi,[-otaring-]{+'otaring+} alumi,ʔ o t a r i ŋ _ a l u m i,,datasets_Adang_Lawahing_tsv
1787,adan1251-lawah,tomorrow,dilɛlɛ,dilɛlɛ,dilele,d i l ɛ l ɛ,,datasets_Adang_Lawahing_tsv
1788,adan1251-lawah,day_after_tomorrow,a:lu,aːlu,alu,aː l u,,datasets_Adang_Lawahing_tsv
1789,adan1251-lawah,twilight_dawn,lalami,lalami,lalami,l a l a m i,"(lit, 'early morning')",datasets_Adang_Lawahing_tsv

我想用它作为git apply的补丁。

但是,普通git apply words.diff会因fatal: corrupt patch at line 6而失败-正常的diff文件将以未受影响的行中的空格开头-我看不到任何可能使git apply在其手册页中接受word-diff文件的东西。

我如何说服git apply接受这种格式的文件作为补丁?或者,如何轻松地将此文件转换为有效的补丁?

EN

回答 1

Stack Overflow用户

发布于 2019-05-11 21:29:51

我找不到一个有效的解决方案,所以我编写了一个脚本,将word-diff转换为可以应用的常规diff:

代码语言:javascript
代码运行次数:0
复制
#!/usr/bin/env perl
# convert-word-diff.pl -- rev. 2, this script is licensed under WTFPLv2

my (@minus, @plus);

sub flush_diff {
  print join("", map { "-$_" } @minus);
  print join("", map { "+$_" } @plus);
  @minus = (); @plus = ();
}

while (my $line = <>) {
  if ($line =~ /^(?:index |diff |\+\+\+ |\-\-\- |@@ )/) {
    flush_diff();
    print $line;
    next;
  }

  my $is_diff_line;

  if ($line =~ /\[\-.*\-\]/ || $line =~ /\{\+.*?\+\}/) {
    my $copy = $line;
    $copy =~ s/\[\-(.*?)\-\]\{\+.*?\+\}/\1/g;
    $copy =~ s/\[\-(.*?)\-\] ( )?/ \1 /g;
    $copy =~ s/\{\+.*?\+\} ?//g;
    push(@minus, $copy);

    $copy = $line;
    $copy =~ s/\[\-.*?\-\]//g;
    $copy =~ s/\{\+(.*?)\+\}/\1/g;
    push(@plus, $copy);
    $is_diff_line = 1;
  }

  unless ($is_diff_line) {
    flush_diff();
    print " $line" ;
  }
}

flush_diff();

用法:

代码语言:javascript
代码运行次数:0
复制
cat word-diff.txt | perl convert-word-diff.pl | git apply

希望我没有搞砸任何事情,而且您是在Linux/Mac上,并且有Perl。:-)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54708202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档