`ident`
^^^^^^^
-When the attribute `ident` is set to a path, git replaces
-`$Id$` in the blob object with `$Id:`, followed by
+When the attribute `ident` is set for a path, git replaces
+`$Id$` in the blob object with `$Id:`, followed by the
40-character hexadecimal blob object name, followed by a dollar
sign `$` upon checkout. Any byte sequence that begins with
`$Id:` and ends with `$` in the worktree file is replaced
Generating diff text
~~~~~~~~~~~~~~~~~~~~
- The attribute `diff` affects if 'git-diff' generates textual
- patch for the path or just says `Binary files differ`. It also
- can affect what line is shown on the hunk header `@@ -k,l +n,m @@`
- line.
+`diff`
+^^^^^^
+
+ The attribute `diff` affects how 'git' generates diffs for particular
+ files. It can tell git whether to generate a textual patch for the path
+ or to treat the path as a binary file. It can also affect what line is
+ shown on the hunk header `@@ -k,l +n,m @@` line, tell git to use an
+ external command to generate the diff, or ask git to convert binary
+ files to a text format before generating the diff.
Set::
Unset::
A path to which the `diff` attribute is unset will
- generate `Binary files differ`.
+ generate `Binary files differ` (or a binary patch, if
+ binary patches are enabled).
Unspecified::
String::
- Diff is shown using the specified custom diff driver.
- The driver program is given its input using the same
- calling convention as used for GIT_EXTERNAL_DIFF
- program. This name is also used for custom hunk header
- selection.
+ Diff is shown using the specified diff driver. Each driver may
+ specify one or more options, as described in the following
+ section. The options for the diff driver "foo" are defined
+ by the configuration variables in the "diff.foo" section of the
+ git config file.
- Defining a custom diff driver
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ Defining an external diff driver
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The definition of a diff driver is done in `gitconfig`, not
`gitattributes` file, so strictly speaking this manual page is a
wrong place to talk about it. However...
- To define a custom diff driver `jcdiff`, add a section to your
+ To define an external diff driver `jcdiff`, add a section to your
`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
----------------------------------------------------------------
- `tex` suitable for source code for LaTeX documents.
+ Performing text diffs of binary files
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ Sometimes it is desirable to see the diff of a text-converted
+ version of some binary files. For example, a word processor
+ document can be converted to an ASCII text representation, and
+ the diff of the text shown. Even though this conversion loses
+ some information, the resulting diff is useful for human
+ viewing (but cannot be applied directly).
+
+ The `textconv` config option is used to define a program for
+ performing such a conversion. The program should take a single
+ argument, the name of a file to convert, and produce the
+ resulting text on stdout.
+
+ For example, to show the diff of the exif information of a
+ file instead of the binary information (assuming you have the
+ exif tool installed):
+
+ ------------------------
+ [diff "jpg"]
+ textconv = exif
+ ------------------------
+
+ NOTE: The text conversion is generally a one-way conversion;
+ in this example, we lose the actual image contents and focus
+ just on the text data. This means that diffs generated by
+ textconv are _not_ suitable for applying. For this reason,
+ only `git diff` and the `git log` family of commands (i.e.,
+ log, whatchanged, show) will perform text conversion. `git
+ format-patch` will never generate this output. If you want to
+ send somebody a text-converted diff of a binary file (e.g.,
+ because it quickly conveys the changes you have made), you
+ should generate it separately and send it as a comment _in
+ addition to_ the usual binary diff that you might send.
+
+
Performing a three-way merge
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+`merge`
+^^^^^^^
+
The attribute `merge` affects how three versions of a file is
merged when a file-level merge is necessary during `git merge`,
and other programs such as `git revert` and `git cherry-pick`.
mmfile_t minus, plus;
int i;
+ memset(&xpp, 0, sizeof(xpp));
memset(&xecfg, 0, sizeof(xecfg));
minus.size = diff_words->minus.text.size;
minus.ptr = xmalloc(minus.size);
emit_binary_diff_body(file, two, one);
}
- void diff_filespec_load_driver(struct diff_filespec *one)
+ static void diff_filespec_load_driver(struct diff_filespec *one)
{
if (!one->driver)
one->driver = userdiff_find_by_path(one->path);
if (!pe)
pe = diff_funcname_pattern(two);
+ memset(&xpp, 0, sizeof(xpp));
memset(&xecfg, 0, sizeof(xecfg));
memset(&ecbdata, 0, sizeof(ecbdata));
ecbdata.label_path = lbl;
xdemitconf_t xecfg;
xdemitcb_t ecb;
+ memset(&xpp, 0, sizeof(xpp));
memset(&xecfg, 0, sizeof(xecfg));
xpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;
xdi_diff_outf(&mf1, &mf2, diffstat_consume, diffstat,
xdemitconf_t xecfg;
xdemitcb_t ecb;
+ memset(&xpp, 0, sizeof(xpp));
memset(&xecfg, 0, sizeof(xecfg));
xecfg.ctxlen = 1; /* at least one context line */
xpp.flags = XDF_NEED_MINIMAL;
struct diff_filepair *p = q->queue[i];
int len1, len2;
+ memset(&xpp, 0, sizeof(xpp));
memset(&xecfg, 0, sizeof(xecfg));
if (p->status == 0)
return error("internal diff status error");