Как сделать git-применить слово git diff
Мне нужно было отредактировать грязный коммит, который только изменил слово в нескольких последующих строках, сохранив некоторые из этих изменений и удалив другие. Изменения было легко увидеть в git diff --word-diff
и в этом формате я мог бы легко редактировать фрагменты, чтобы делать то, что я собирался сделать, но теперь у меня есть файл, подобный этому
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
принять файл разностного слова на его странице руководства.
Как я могу убедить git apply
взять файл этого формата как патч? Или как я могу легко преобразовать этот файл в корректный патч?
0 ответов
Мне не удалось найти рабочего решения, поэтому я собрал скрипт, который преобразует word-diff в обычный diff, который можно применить:
#!/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();
Применение:
cat word-diff.txt | perl convert-word-diff.pl | git apply
Надеюсь, я ничего не напутал, а вы работаете на Linux/Mac и используете Perl.:-)