Go to file
Luca Milanesio f5f4bf0ad9 Do not exclude objects in locked packs from bitmap processing
Packfiles having an equivalent .keep file are associated with in-flight
pushes that haven't been completed, with potentially a set of git
objects not yet referenced by a ref.

If the Git client is not up-to-date, it may result in pushing a
packfile, generating a <packfile>.keep on the server, which
may also contain existing commits due to the lack of Git protocol
negotiation in the git-receive-pack.

The Git protocol negotiation is the phase where the client and the
server exchange the list of refs they have for trying to find a common
base and minimise the amount of objects to be transferred.

The repack phase in GC was previously skipping all objects that were
contained in all packfiles having a <packfile>.keep file associated
(aka "locked packfiles"), which did not take into consideration the
fact that excluding the existing commits would have resulted in the
generation of an invalid bitmap file.

The code for excluding the objects in the locked packfiles was written
well before the bitmap was introduced, hence could not consider a use
case that did not exist at that time.

However, when the bitmap was introduced, the exclusion of locked
packfiles was not changed, hence creating a potential problem.
The issue went unnoticed for many years because the bitmap generation
was disabled when JGit noticed any locked packfiles; however, the
bitmaps are enabled again since  Id722e68d9f , and the the issue is now
visible and is impacting the GC repack phase.

Introduce the '--pack-kept-objects' option in GC for including the
objects contained in the locked packfiles during the repack phase,
which is not an issue because of the following:

- If there are any existing commits duplicated in the packfiles
  they will be just considered once anyway because the repack doesn't
  generate duplicates in the output packfile.

- If there are any new commits that do not have any ref pointing to
  them, they will be automatically excluded from the output repacked
  packfile.

The same identical solution is adopted in the C implementation of git
in repack.c.

Because the locked packfile is not pruned, any new commits not pointed
by any refs will remain in the repository and there will not be any
accidental pruning or object loss as it is today before this change.

As a side-effect of this change, it is now potentially possible to still
have duplicate BLOBs after GC when the keep packfile contained existing
objects. However, it is way better to keep the duplication until the
next GC phase rather than omitting existing objects from repacking and,
therefore generating an invalid bitmap and incorrect packfile.

Bug: 582292
Bug: 582455
Change-Id: Ide3445e652fcf256a7912f881cb898897c99b8f8
2023-10-12 22:46:08 +02:00
.mvn Remove blank in maven.config 2023-04-15 00:42:22 +02:00
.settings Add resource preferences for top level jgit project 2019-12-16 11:20:12 +01:00
Documentation Add pack options to preserve and prune old pack files 2023-02-11 01:19:28 +01:00
lib Use slf4j-simple instead of log4j for logging 2021-12-31 01:09:52 +01:00
org.eclipse.jgit Do not exclude objects in locked packs from bitmap processing 2023-10-12 22:46:08 +02:00
org.eclipse.jgit.ant Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.ant.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.archive Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.benchmarks Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.coverage Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.gpg.bc Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.gpg.bc.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.http.apache Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.http.server Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.http.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.junit Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.junit.http Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.junit.ssh Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.lfs Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.lfs.server Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.lfs.server.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.lfs.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.packaging Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.pgm Do not exclude objects in locked packs from bitmap processing 2023-10-12 22:46:08 +02:00
org.eclipse.jgit.pgm.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.ssh.apache Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.ssh.apache.agent Do not exclude objects in locked packs from bitmap processing 2023-10-12 22:46:08 +02:00
org.eclipse.jgit.ssh.apache.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.ssh.jsch Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.ssh.jsch.test Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
org.eclipse.jgit.test Do not exclude objects in locked packs from bitmap processing 2023-10-12 22:46:08 +02:00
org.eclipse.jgit.ui Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
tools Demote severity of some error prone bug patterns to warnings 2023-04-26 21:07:41 +02:00
.bazelrc Bazel: Add workspace status command to stamp final artifact 2020-07-17 01:10:15 +02:00
.bazelversion Bump bazel version to 4.0.0 2021-02-07 23:06:25 +01:00
.gitattributes Initial JGit contribution to eclipse.org 2009-09-29 16:47:03 -07:00
.gitignore .gitignore: remove editor- and OS-specific files 2019-04-01 13:38:00 -07:00
.mailmap Update .mailmap 2018-09-25 19:03:22 -04:00
BUILD Migrate to Apache MINA sshd 2.6.0 and Orbit I20210203173513 2021-02-04 08:35:12 +01:00
CODE_OF_CONDUCT.md Add Eclipse code of conduct and security policy 2021-06-15 13:44:58 +02:00
CONTRIBUTING.md CONTRIBUTING: add explicit link to ECA 2021-06-15 14:01:00 +02:00
DEPENDENCIES Update Orbit to S20210817231813 2021-08-23 11:53:15 +02:00
LICENSE Clean up LICENSE file 2010-07-02 14:52:49 -07:00
README.md Update README 2019-02-19 08:34:38 +09:00
SECURITY.md Add Eclipse code of conduct and security policy 2021-06-15 13:44:58 +02:00
WORKSPACE Update orbit to R20211213173813 2021-12-31 01:09:51 +01:00
pom.xml Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00
release-notes.txt Prepare 5.13.3-SNAPSHOT builds 2023-06-22 02:15:21 +02:00

README.md

Java Git

An implementation of the Git version control system in pure Java.

This project is licensed under the EDL (Eclipse Distribution License).

JGit can be imported straight into Eclipse and built and tested from there. It can be built from the command line using Maven or Bazel. The CI builds use Maven and run on Jenkins.

  • org.eclipse.jgit

    A pure Java library capable of being run standalone, with no additional support libraries. It provides classes to read and write a Git repository and operate on a working directory.

    All portions of JGit are covered by the EDL. Absolutely no GPL, LGPL or EPL contributions are accepted within this package.

  • org.eclipse.jgit.ant

    Ant tasks based on JGit.

  • org.eclipse.jgit.archive

    Support for exporting to various archive formats (zip etc).

  • org.eclipse.jgit.http.apache

    Apache httpclient support.

  • org.eclipse.jgit.http.server

    Server for the smart and dumb Git HTTP protocol.

  • org.eclipse.jgit.lfs

    Support for LFS (Large File Storage).

  • org.eclipse.jgit.lfs.server

    Basic LFS server support.

  • org.eclipse.jgit.packaging

    Production of Eclipse features and p2 repository for JGit. See the JGit Wiki on why and how to use this module.

  • org.eclipse.jgit.pgm

    Command-line interface Git commands implemented using JGit ("pgm" stands for program).

  • org.eclipse.jgit.ssh.apache

    Client support for the ssh protocol based on Apache Mina sshd.

  • org.eclipse.jgit.ui

    Simple UI for displaying git log.

Tests

  • org.eclipse.jgit.junit, org.eclipse.jgit.junit.http, org.eclipse.jgit.junit.ssh: Helpers for unit testing
  • org.eclipse.jgit.ant.test: Unit tests for org.eclipse.jgit.ant
  • org.eclipse.jgit.http.test: Unit tests for org.eclipse.jgit.http.server
  • org.eclipse.jgit.lfs.server.test: Unit tests for org.eclipse.jgit.lfs.server
  • org.eclipse.jgit.lfs.test: Unit tests for org.eclipse.jgit.lfs
  • org.eclipse.jgit.pgm.test: Unit tests for org.eclipse.jgit.pgm
  • org.eclipse.jgit.ssh.apache.test: Unit tests for org.eclipse.jgit.ssh.apache
  • org.eclipse.jgit.test: Unit tests for org.eclipse.jgit

Warnings/Caveats

  • Native symbolic links are supported, provided the file system supports them. For Windows you must use a non-administrator account and have the SeCreateSymbolicLinkPrivilege.

  • Only the timestamp of the index is used by JGit if the index is dirty.

  • JGit requires at least a Java 8 JDK.

  • CRLF conversion is performed depending on the core.autocrlf setting, however Git for Windows by default stores that setting during installation in the "system wide" configuration file. If Git is not installed, use the global or repository configuration for the core.autocrlf setting.

  • The system wide configuration file is located relative to where C Git is installed. Make sure Git can be found via the PATH environment variable. When installing Git for Windows check the "Run Git from the Windows Command Prompt" option. There are other options like Eclipse settings that can be used for pointing out where C Git is installed. Modifying PATH is the recommended option if C Git is installed.

  • We try to use the same notation of $HOME as C Git does. On Windows this is often not the same value as the user.home system property.

Features

  • org.eclipse.jgit

    • Read loose and packed commits, trees, blobs, including deltafied objects.

    • Read objects from shared repositories

    • Write loose commits, trees, blobs.

    • Write blobs from local files or Java InputStreams.

    • Read blobs as Java InputStreams.

    • Copy trees to local directory, or local directory to a tree.

    • Lazily loads objects as necessary.

    • Read and write .git/config files.

    • Create a new repository.

    • Read and write refs, including walking through symrefs.

    • Read, update and write the Git index.

    • Checkout in dirty working directory if trivial.

    • Walk the history from a given set of commits looking for commits introducing changes in files under a specified path.

    • Object transport

      Fetch via ssh, git, http, Amazon S3 and bundles. Push via ssh, git and Amazon S3. JGit does not yet deltify the pushed packs so they may be a lot larger than C Git packs.

    • Garbage collection

    • Merge

    • Rebase

    • And much more

  • org.eclipse.jgit.pgm

    • Assorted set of command line utilities. Mostly for ad-hoc testing of jgit log, glog, fetch etc.
  • org.eclipse.jgit.ant

    • Ant tasks
  • org.eclipse.jgit.archive

    • Support for Zip/Tar and other formats
  • org.eclipse.http

    • HTTP client and server support

Missing Features

There are some missing features:

  • verifying signed commits
  • signing tags
  • signing push

Support

Post questions, comments or discussions to the jgit-dev@eclipse.org mailing list. You need to be subscribed to post. File bugs and enhancement requests in Bugzilla.

Contributing

See the EGit Contributor Guide.

About Git

More information about Git, its repository format, and the canonical C based implementation can be obtained from the Git website.