git apply does not work correctly with zero-context patches. It does a little better with --unidiff-zero. --- This appears to fix staging hunks with zero context lines in the majority of cases. Staging individual lines still is a problem frequently. In any case, it's easy enough to break zero-context diff & patch like this: echo a > victim git add victim echo b >> victim git diff -U0 | git apply --cached --unidiff-zero git diff So before delving into this problem to deeply, I'd like to find out who needs fixing exactly. Is there documentation defining how zero-context git diff output should look like? Or is git apply the culprit in the bug above? Or do we even want to support applying zero-context patches? If not, we should detect and fail such attempts. Clemens git-gui/lib/diff.tcl | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl index 52b79e4..78c1b56 100644 --- a/git-gui/lib/diff.tcl +++ b/git-gui/lib/diff.tcl @@ -302,12 +302,15 @@ proc read_diff {fd scroll_pos} { proc apply_hunk {x y} { global current_diff_path current_diff_header current_diff_side - global ui_diff ui_index file_states + global ui_diff ui_index file_states repo_config if {$current_diff_path eq {} || $current_diff_header eq {}} return if {![lock_index apply_hunk]} return set apply_cmd {apply --cached --whitespace=nowarn} + if {$repo_config(gui.diffcontext) eq 0} { + lappend apply_cmd --unidiff-zero + } set mi [lindex $file_states($current_diff_path) 0] if {$current_diff_side eq $ui_index} { set failed_msg [mc "Failed to unstage selected hunk."] @@ -375,12 +378,15 @@ proc apply_hunk {x y} { proc apply_line {x y} { global current_diff_path current_diff_header current_diff_side - global ui_diff ui_index file_states + global ui_diff ui_index file_states repo_config if {$current_diff_path eq {} || $current_diff_header eq {}} return if {![lock_index apply_hunk]} return set apply_cmd {apply --cached --whitespace=nowarn} + if {$repo_config(gui.diffcontext) eq 0} { + lappend apply_cmd --unidiff-zero + } set mi [lindex $file_states($current_diff_path) 0] if {$current_diff_side eq $ui_index} { set failed_msg [mc "Failed to unstage selected line."] -- 1.6.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html