Jeff King 159e7b080b fsck: detect gitmodules files
In preparation for performing fsck checks on .gitmodules
files, this commit plumbs in the actual detection of the
files. Note that unlike most other fsck checks, this cannot
be a property of a single object: we must know that the
object is found at a ".gitmodules" path at the root tree of
a commit.

Since the fsck code only sees one object at a time, we have
to mark the related objects to fit the puzzle together. When
we see a commit we mark its tree as a root tree, and when
we see a root tree with a .gitmodules file, we mark the
corresponding blob to be checked.

In an ideal world, we'd check the objects in topological
order: commits followed by trees followed by blobs. In that
case we can avoid ever loading an object twice, since all
markings would be complete by the time we get to the marked
objects. And indeed, if we are checking a single packfile,
this is the order in which Git will generally write the
objects. But we can't count on that:

  1. git-fsck may show us the objects in arbitrary order
     (loose objects are fed in sha1 order, but we may also
     have multiple packs, and we process each pack fully in
     sequence).

  2. The type ordering is just what git-pack-objects happens
     to write now. The pack format does not require a
     specific order, and it's possible that future versions
     of Git (or a custom version trying to fool official
     Git's fsck checks!) may order it differently.

  3. We may not even be fscking all of the relevant objects
     at once. Consider pushing with transfer.fsckObjects,
     where one push adds a blob at path "foo", and then a
     second push adds the same blob at path ".gitmodules".
     The blob is not part of the second push at all, but we
     need to mark and check it.

So in the general case, we need to make up to three passes
over the objects: once to make sure we've seen all commits,
then once to cover any trees we might have missed, and then
a final pass to cover any .gitmodules blobs we found in the
second pass.

We can simplify things a bit by loosening the requirement
that we find .gitmodules only at root trees. Technically
a file like "subdir/.gitmodules" is not parsed by Git, but
it's not unreasonable for us to declare that Git is aware of
all ".gitmodules" files and make them eligible for checking.
That lets us drop the root-tree requirement, which
eliminates one pass entirely. And it makes our worst case
much better: instead of potentially queueing every root tree
to be re-examined, the worst case is that we queue each
unique .gitmodules blob for a second look.

This patch just adds the boilerplate to find .gitmodules
files. The actual content checks will come in a subsequent
commit.

Signed-off-by: Jeff King <peff@peff.net>
2018-05-21 23:55:12 -04:00
2018-05-21 23:55:12 -04:00
2018-03-15 15:00:46 -07:00
2017-07-06 18:14:44 -07:00
2017-06-24 14:28:41 -07:00
2017-06-24 14:28:41 -07:00
2017-03-13 15:28:54 -07:00
2017-11-15 12:14:28 +09:00
2018-03-06 14:54:07 -08:00
2017-05-25 13:08:23 +09:00
2017-05-08 15:12:57 +09:00
2017-05-08 15:12:57 +09:00
2017-12-27 11:16:25 -08:00
2017-12-27 11:16:25 -08:00
2017-08-03 11:08:10 -07:00
2018-03-06 14:54:07 -08:00
2017-05-02 10:46:41 +09:00
2018-02-13 10:17:12 -08:00
2018-02-13 10:17:12 -08:00
2017-10-24 10:19:06 +09:00
2018-03-06 14:54:07 -08:00
2017-01-25 14:42:37 -08:00
2018-03-06 14:54:07 -08:00
2018-02-13 13:39:08 -08:00
2018-02-13 13:39:04 -08:00
2018-02-15 14:55:43 -08:00
2017-06-24 14:28:41 -07:00
2018-02-02 11:28:41 -08:00
2018-02-02 11:28:41 -08:00
2017-12-08 09:16:27 -08:00
2017-12-08 09:16:27 -08:00
2018-03-06 14:54:07 -08:00
2018-02-15 14:55:43 -08:00
2018-02-22 10:08:05 -08:00
2018-03-06 14:54:07 -08:00
2018-05-21 23:55:12 -04:00
2018-05-21 23:55:12 -04:00
2018-04-02 10:13:35 -07:00
2018-02-13 10:17:12 -08:00
2017-11-21 14:05:30 +09:00
2018-03-06 14:54:07 -08:00
2018-03-21 11:30:12 -07:00
2017-06-24 14:28:41 -07:00
2018-02-22 10:08:05 -08:00
2018-02-22 10:08:05 -08:00
2017-01-30 14:17:00 -08:00
2017-09-06 17:19:54 +09:00
2018-03-06 14:54:07 -08:00
2018-03-15 15:00:46 -07:00
2018-03-06 14:54:07 -08:00
2017-12-27 12:28:06 -08:00
2017-11-22 14:11:56 +09:00
2018-03-06 14:54:07 -08:00
2018-02-02 11:28:41 -08:00
2018-03-06 14:54:07 -08:00
2017-08-22 10:29:03 -07:00
2017-05-29 12:34:43 +09:00
2017-12-13 11:14:25 -08:00
2017-12-06 09:23:44 -08:00
2017-10-17 10:51:29 +09:00
2017-12-12 10:41:15 -08:00
2017-12-19 11:33:55 -08:00
2018-01-16 12:16:54 -08:00
2018-03-22 14:24:45 -07:00
2018-01-22 11:32:51 -08:00
2017-03-31 08:33:56 -07:00
2018-02-27 10:33:58 -08:00
2018-05-21 23:55:12 -04:00
2017-03-31 08:33:56 -07:00
2017-09-29 11:23:43 +09:00
2018-03-06 14:54:07 -08:00
2018-03-14 12:01:05 -07:00
2018-02-22 10:08:05 -08:00
2018-02-22 10:08:05 -08:00
2018-02-22 10:08:05 -08:00
2017-08-26 22:55:04 -07:00
2018-02-13 13:39:04 -08:00
2018-02-13 13:39:04 -08:00
2017-06-24 14:28:41 -07:00
2018-03-29 15:39:59 -07:00
2018-03-29 15:39:59 -07:00
2018-05-21 23:50:11 -04:00
2018-02-22 10:08:05 -08:00

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-.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://public-inbox.org/git/, http://marc.info/?l=git and other archival sites.

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%