Re: Re* [PATCH] Documentation/git-blame.txt: --follow is a NO-OP
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 21, 2012, 21:00 UTC
- Message-ID
- <7vpq5f3xct.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <7v7grn5h1l.fsf_-_@alter.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
Show 7 quoted lines
> Let's do this for now instead. That would make it clear to people > who (rightly or wrongly) think the "--follow" option should do > something that we already do so, and explain the output that they > see when they do give the "--follow" option to the command. > > I may do a "--no-follow" patch as a follow-up, or I may not, > depending on the mood and workload.
A patch to do so looks like this.
If you know your history did not have any rename, or if you care only about the history after a large rename that happened some time ago, "git blame --no-follow $path" can be a way to tell the command not to bother about them.
When you use -C, the lines that came from the renamed file will still be found without the whole-file rename detection anyway, and this is not all that interesting either way, I would think.
diff --git c/builtin/blame.c w/builtin/blame.c index cad4111..bfa6086 100644 --- c/builtin/blame.c +++ w/builtin/blame.c @@ -42,6 +42,7 @@ static int blank_boundary; static int incremental; static int xdl_opts; static int abbrev = -1; +static int no_whole_file_rename; static enum date_mode blame_date_mode = DATE_ISO8601; static size_t blame_date_width; @@ -1226,7 +1227,7 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt) * The first pass looks for unrenamed path to optimize for * common cases, then we look for renames in the second pass. */ - for (pass = 0; pass < 2; pass++) { + for (pass = 0; pass < 2 - no_whole_file_rename; pass++) { struct origin *(*find)(struct scoreboard *, struct commit *, struct origin *); find = pass ? find_rename : find_origin; @@ -2344,6 +2345,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) init_revisions(&revs, NULL); revs.date_mode = blame_date_mode; DIFF_OPT_SET(&revs.diffopt, ALLOW_TEXTCONV); + DIFF_OPT_SET(&revs.diffopt, FOLLOW_RENAMES); save_commit_buffer = 0; dashdash_pos = 0; @@ -2367,6 +2369,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix) parse_revision_opt(&revs, &ctx, options, blame_opt_usage); } parse_done: + no_whole_file_rename = !DIFF_OPT_TST(&revs.diffopt, FOLLOW_RENAMES); + DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES); argc = parse_options_end(&ctx); if (0 < abbrev) diff --git c/diff.c w/diff.c index f1b0447..32ebcbb 100644 --- c/diff.c +++ w/diff.c @@ -3584,6 +3584,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) DIFF_OPT_SET(options, FIND_COPIES_HARDER); else if (!strcmp(arg, "--follow")) DIFF_OPT_SET(options, FOLLOW_RENAMES); + else if (!strcmp(arg, "--no-follow")) + DIFF_OPT_CLR(options, FOLLOW_RENAMES); else if (!strcmp(arg, "--color")) options->use_color = 1; else if (!prefixcmp(arg, "--color=")) {