I needed to edit a messy commit commit that only changed a word in a few subsequent rows, keeping some of those changes and removing others.
The changes were easy to see in git diff --word-diff
, and in that format I could easily edit the hunks to do what I intended to do, but now I have a file like this
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
which I would like to use as a patch for git apply
.
However, vanilla git apply words.diff
fails with a fatal: corrupt patch at line 6
– a normal diff file would start with a space in that unaffected line – and I don't see anything that might make git apply
accept a word-diff file in its manpage.
How can I convince git apply
to take a file of this format as patch? Or how can I easily convert this file into a valid patch?
You can run the git diff HEAD command to compare the both staged and unstaged changes with your last commit. You can also run the git diff <branch_name1> <branch_name2> command to compare the changes from the first branch with changes from the second branch. Order does matter when you're comparing branches.
The git diff command displays the differences between files in two commits or between a commit and your current repository. You can see what text has been added to, removed from, and changed in a file. By default, the git diff command displays any uncommitted changes to your repository.
Diffing is a function that takes two input data sets and outputs the changes between them. git diff is a multi-use Git command that when executed runs a diff function on Git data sources. These data sources can be commits, branches, files and more.
I couldn't find a working solution, so I've put together a script that converts word-diff into a regular diff that can be applied:
#!/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();
Usage:
cat word-diff.txt | perl convert-word-diff.pl | git apply
Hopefully I didn't mess up anything and you are on Linux/Mac and have Perl. :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With