Elijah Newren ae1db7b31c diffcore-rename: take advantage of "majority rules" to skip more renames
In directory rename detection (when a directory is removed on one side
of history and the other side adds new files to that directory), we work
to find where the greatest number of files within that directory were
renamed to so that the new files can be moved with the majority of the
files.

Naively, we can just do this by detecting renames for *all* files within
the removed/renamed directory, looking at all the destination
directories where files within that directory were moved, and if there
is more than one such directory then taking the one with the greatest
number of files as the directory where the old directory was renamed to.

However, sometimes there are enough renames from exact rename detection
or basename-guided rename detection that we have enough information to
determine the majority winner already.  Add a function meant to compute
whether particular renames are still needed based on this majority rules
check.  The next several commits will then add the necessary
infrastructure to get the information we need to compute which
additional rename sources we can skip.

An important side note for future further optimization:

There is a possible improvement to this optimization that I have not yet
attempted and will not be included in this series of patches: we could
first check whether exact renames provide enough information for us to
determine directory renames, and avoid doing basename-guided rename
detection on some or all of the RELEVANT_LOCATION files within those
directories.  In effect, this variant would mean doing the
handle_early_known_dir_renames() both after exact rename detection and
again after basename-guided rename detection, though it would also mean
decrementing the number of "unknown" renames for each rename we found
from basename-guided rename detection.  Adding this additional check for
skippable renames right after exact rename detection might turn out to
be valuable, especially for partial clones where it might allow us to
download certain source files entirely.  However, this particular
optimization was actually the last one I did in original implementation
order, and by the time I implemented this idea, every testcase I had was
sufficiently fast that further optimization was unwarranted.  If future
testcases arise that tax rename detection more heavily (or perhaps
partial clones can benefit from avoiding loading more objects), it may
be worth implementing this more involved variant.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-03-18 14:32:55 -07:00
2021-02-10 14:48:33 -08:00
2020-12-08 14:48:16 -08:00
2020-11-09 14:06:25 -08:00
2020-08-13 11:02:15 -07:00
2020-12-08 15:11:21 -08:00
2020-03-05 10:43:02 -08:00
2021-01-21 15:50:00 -08:00
2020-12-08 15:11:17 -08:00
2020-12-18 15:15:18 -08:00
2021-01-04 13:01:55 -08:00
2020-11-21 15:14:38 -08:00
2020-09-02 14:39:25 -07:00
2020-11-18 13:32:53 -08:00
2020-08-11 18:04:11 -07:00
2021-01-23 17:14:07 -08:00
2021-01-23 17:14:07 -08:00
2021-02-10 14:48:33 -08:00
2020-08-10 10:23:57 -07:00
2021-02-10 14:48:31 -08:00
2021-02-10 14:48:33 -08:00
2021-01-25 14:19:19 -08:00
2020-07-06 22:09:13 -07:00
2020-08-24 14:54:31 -07:00
2020-11-12 09:40:06 -08:00
2020-07-30 19:18:06 -07:00
2020-07-30 19:18:06 -07:00
2020-07-28 15:02:17 -07:00
2020-09-03 12:37:04 -07:00
2020-03-24 15:04:43 -07:00
2021-01-05 14:58:29 -08:00
2020-11-09 14:06:25 -08:00
2021-02-08 14:05:55 -08:00
2021-01-25 14:19:19 -08:00
2020-07-30 19:18:06 -07:00
2020-07-30 19:18:06 -07:00
2020-06-25 12:27:47 -07:00
2020-12-14 15:01:03 -08:00
2021-02-05 16:40:44 -08:00
2021-02-05 16:40:45 -08:00
2020-07-28 15:02:17 -07:00
2021-01-25 14:19:17 -08:00
2020-05-01 13:39:55 -07:00
2021-01-25 14:19:20 -08:00
2020-08-28 14:07:09 -07:00
2020-07-30 19:18:06 -07:00
2020-07-06 22:09:13 -07:00
2020-03-24 15:04:44 -07:00
2020-03-24 15:04:44 -07:00
2021-02-05 16:40:45 -08:00
2021-02-05 16:40:45 -08:00
2021-02-05 16:40:45 -08:00
2020-12-14 10:21:36 -08:00
2020-10-27 15:09:50 -07:00
2021-02-05 16:31:28 -08:00
2021-01-12 12:06:14 -08:00
2020-04-29 16:15:27 -07:00
2021-02-10 14:48:31 -08:00
2021-02-05 16:40:44 -08:00
2020-07-28 15:02:17 -07:00
2020-08-11 18:04:11 -07:00
2020-07-30 19:18:06 -07:00
2020-07-30 19:18:06 -07:00
2020-07-30 19:18:06 -07:00
2021-01-04 15:23:08 -08:00
2020-07-28 15:02:17 -07:00
2020-11-02 13:17:46 -08:00

Build status

Git - fast, scalable, distributed revision control system

Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals.

Git is an Open Source project covered by the GNU General Public License version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

Many Git online resources are accessible from https://git-scm.com/ including full documentation and Git related tools.

See Documentation/gittutorial.txt to get started, then see Documentation/giteveryday.txt for a useful minimum set of commands, and Documentation/git-<commandname>.txt for documentation of each command. If git has been correctly installed, then the tutorial can also be read with man gittutorial or git help tutorial, and the documentation of each command with man git-<commandname> or git help <commandname>.

CVS users may also want to read Documentation/gitcvs-migration.txt (man gitcvs-migration or git help cvs-migration if git is installed).

The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read Documentation/SubmittingPatches for instructions on patch submission). To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org. The mailing list archives are available at https://lore.kernel.org/git/, http://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (depending on your mood):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.
  • "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • "goddamn idiotic truckload of sh*t": when it breaks
Description
Git with broken hash generation to generate collisions between object IDs. Don't use this!
https://undefinedbehavior.de/posts/commit-vandalism/
Readme 217 MiB
Languages
C 50%
Shell 38.2%
Perl 5.5%
Tcl 3.5%
Python 0.9%
Other 1.7%