Class Repository

  • All Implemented Interfaces:
    AutoCloseable
    Direct Known Subclasses:
    DfsRepository, FileRepository

    public abstract class Repository
    extends Object
    implements AutoCloseable
    Represents a Git repository.

    A repository holds all objects and refs used for managing source code (could be any type of file, but source code is what SCM's are typically used for).

    The thread-safety of a Repository very much depends on the concrete implementation. Applications working with a generic Repository type must not assume the instance is thread-safe.

    • FileRepository is thread-safe.
    • DfsRepository thread-safety is determined by its subclass.
    • Constructor Detail

      • Repository

        protected Repository​(BaseRepositoryBuilder options)
        Initialize a new repository instance.
        Parameters:
        options - options to configure the repository.
    • Method Detail

      • getGlobalListenerList

        public static ListenerList getGlobalListenerList()
        Get the global listener list observing all events in this JVM.
        Returns:
        the global listener list observing all events in this JVM.
      • getListenerList

        @NonNull
        public ListenerList getListenerList()
        Get listeners observing only events on this repository.
        Returns:
        listeners observing only events on this repository.
      • fireEvent

        public void fireEvent​(RepositoryEvent<?> event)
        Fire an event to all registered listeners.

        The source repository of the event is automatically set to this repository, before the event is delivered to any listeners.

        Parameters:
        event - the event to deliver.
      • create

        public void create()
                    throws IOException
        Create a new Git repository.

        Repository with working tree is created using this method. This method is the same as create(false).

        Throws:
        IOException
        See Also:
        create(boolean)
      • create

        public abstract void create​(boolean bare)
                             throws IOException
        Create a new Git repository initializing the necessary files and directories.
        Parameters:
        bare - if true, a bare repository (a repository without a working directory) is created.
        Throws:
        IOException - in case of IO problem
      • getDirectory

        public File getDirectory()
        Get local metadata directory
        Returns:
        local metadata directory; null if repository isn't local.
      • getIdentifier

        public abstract String getIdentifier()
        Get repository identifier.
        Returns:
        repository identifier. The returned identifier has to be unique within a given Git server.
        Since:
        5.4
      • getObjectDatabase

        @NonNull
        public abstract ObjectDatabase getObjectDatabase()
        Get the object database which stores this repository's data.
        Returns:
        the object database which stores this repository's data.
      • getRefDatabase

        @NonNull
        public abstract RefDatabase getRefDatabase()
        Get the reference database which stores the reference namespace.
        Returns:
        the reference database which stores the reference namespace.
      • getConfig

        @NonNull
        public abstract StoredConfig getConfig()
        Get the configuration of this repository.
        Returns:
        the configuration of this repository.
      • getFS

        public FS getFS()
        Get the used file system abstraction.
        Returns:
        the used file system abstraction, or null if repository isn't local.
      • hasObject

        @Deprecated
        public boolean hasObject​(AnyObjectId objectId)
        Deprecated.
        use getObjectDatabase().has(objectId)
        Whether the specified object is stored in this repo or any of the known shared repositories.
        Parameters:
        objectId - a AnyObjectId object.
        Returns:
        true if the specified object is stored in this repo or any of the known shared repositories.
      • updateRef

        @NonNull
        public RefUpdate updateRef​(String ref)
                            throws IOException
        Create a command to update, create or delete a ref in this repository.
        Parameters:
        ref - name of the ref the caller wants to modify.
        Returns:
        an update command. The caller must finish populating this command and then invoke one of the update methods to actually make a change.
        Throws:
        IOException - a symbolic ref was passed in and could not be resolved back to the base ref, as the symbolic ref could not be read.
      • updateRef

        @NonNull
        public RefUpdate updateRef​(String ref,
                                   boolean detach)
                            throws IOException
        Create a command to update, create or delete a ref in this repository.
        Parameters:
        ref - name of the ref the caller wants to modify.
        detach - true to create a detached head
        Returns:
        an update command. The caller must finish populating this command and then invoke one of the update methods to actually make a change.
        Throws:
        IOException - a symbolic ref was passed in and could not be resolved back to the base ref, as the symbolic ref could not be read.
      • renameRef

        @NonNull
        public RefRename renameRef​(String fromRef,
                                   String toRef)
                            throws IOException
        Create a command to rename a ref in this repository
        Parameters:
        fromRef - name of ref to rename from
        toRef - name of ref to rename to
        Returns:
        an update command that knows how to rename a branch to another.
        Throws:
        IOException - the rename could not be performed.
      • resolve

        @Nullable
        public ObjectId resolve​(String revstr)
                         throws AmbiguousObjectException,
                                IncorrectObjectTypeException,
                                RevisionSyntaxException,
                                IOException
        Parse a git revision string and return an object id. Combinations of these operators are supported:
        • HEAD, MERGE_HEAD, FETCH_HEAD
        • SHA-1: a complete or abbreviated SHA-1
        • refs/...: a complete reference name
        • short-name: a short reference name under refs/heads, refs/tags, or refs/remotes namespace
        • tag-NN-gABBREV: output from describe, parsed by treating ABBREV as an abbreviated SHA-1.
        • id^: first parent of commit id, this is the same as id^1
        • id^0: ensure id is a commit
        • id^n: n-th parent of commit id
        • id~n: n-th historical ancestor of id, by first parent. id~3 is equivalent to id^1^1^1 or id^^^.
        • id:path: Lookup path under tree named by id
        • id^{commit}: ensure id is a commit
        • id^{tree}: ensure id is a tree
        • id^{tag}: ensure id is a tag
        • id^{blob}: ensure id is a blob

        The following operators are specified by Git conventions, but are not supported by this method:

        • ref@{n}: n-th version of ref as given by its reflog
        • ref@{time}: value of ref at the designated time
        Parameters:
        revstr - A git object references expression
        Returns:
        an ObjectId or null if revstr can't be resolved to any ObjectId
        Throws:
        AmbiguousObjectException - revstr contains an abbreviated ObjectId and this repository contains more than one object which match to the input abbreviation.
        IncorrectObjectTypeException - the id parsed does not meet the type required to finish applying the operators in the expression.
        RevisionSyntaxException - the expression is not supported by this implementation, or does not meet the standard syntax.
        IOException - on serious errors
      • incrementOpen

        public void incrementOpen()
        Increment the use counter by one, requiring a matched close().
      • close

        public void close()

        Decrement the use count, and maybe close resources.

        Specified by:
        close in interface AutoCloseable
      • doClose

        protected void doClose()
        Invoked when the use count drops to zero during close().

        The default implementation closes the object and ref databases.

      • getFullBranch

        @Nullable
        public String getFullBranch()
                             throws IOException
        Get the name of the reference that HEAD points to.

        This is essentially the same as doing:

         return exactRef(Constants.HEAD).getTarget().getName()
         
        Except when HEAD is detached, in which case this method returns the current ObjectId in hexadecimal string format.
        Returns:
        name of current branch (for example refs/heads/master), an ObjectId in hex format if the current branch is detached, or null if the repository is corrupt and has no HEAD reference.
        Throws:
        IOException
      • getBranch

        @Nullable
        public String getBranch()
                         throws IOException
        Get the short name of the current branch that HEAD points to.

        This is essentially the same as getFullBranch(), except the leading prefix refs/heads/ is removed from the reference before it is returned to the caller.

        Returns:
        name of current branch (for example master), an ObjectId in hex format if the current branch is detached, or null if the repository is corrupt and has no HEAD reference.
        Throws:
        IOException
      • getInitialBranch

        @NonNull
        protected String getInitialBranch()
        Get the initial branch name of a new repository
        Returns:
        the initial branch name of a new repository
        Since:
        5.11
      • getAdditionalHaves

        @NonNull
        public Set<ObjectId> getAdditionalHaves()
                                         throws IOException
        Objects known to exist but not expressed by getAllRefs().

        When a repository borrows objects from another repository, it can advertise that it safely has that other repository's references, without exposing any other details about the other repository. This may help a client trying to push changes avoid pushing more than it needs to.

        Returns:
        unmodifiable collection of other known objects.
        Throws:
        IOException
      • exactRef

        @Nullable
        public final Ref exactRef​(String name)
                           throws IOException
        Get a ref by name.
        Parameters:
        name - the name of the ref to lookup. Must not be a short-hand form; e.g., "master" is not automatically expanded to "refs/heads/master".
        Returns:
        the Ref with the given name, or null if it does not exist
        Throws:
        IOException
        Since:
        4.2
      • findRef

        @Nullable
        public final Ref findRef​(String name)
                          throws IOException
        Search for a ref by (possibly abbreviated) name.
        Parameters:
        name - the name of the ref to lookup. May be a short-hand form, e.g. "master" which is automatically expanded to "refs/heads/master" if "refs/heads/master" already exists.
        Returns:
        the Ref with the given name, or null if it does not exist
        Throws:
        IOException
        Since:
        4.2
      • getAllRefs

        @Deprecated
        @NonNull
        public Map<String,​Ref> getAllRefs()
        Deprecated.
        use getRefDatabase().getRefs() instead.
        Get mutable map of all known refs, including symrefs like HEAD that may not point to any object yet.
        Returns:
        mutable map of all known refs (heads, tags, remotes).
      • getTags

        @Deprecated
        @NonNull
        public Map<String,​Ref> getTags()
        Deprecated.
        use getRefDatabase().getRefsByPrefix(R_TAGS) instead
        Get mutable map of all tags
        Returns:
        mutable map of all tags; key is short tag name ("v1.0") and value of the entry contains the ref with the full tag name ("refs/tags/v1.0").
      • peel

        @Deprecated
        @NonNull
        public Ref peel​(Ref ref)
        Deprecated.
        use getRefDatabase().peel(ref) instead.
        Peel a possibly unpeeled reference to an annotated tag.

        If the ref cannot be peeled (as it does not refer to an annotated tag) the peeled id stays null, but Ref.isPeeled() will be true.

        Parameters:
        ref - The ref to peel
        Returns:
        ref if ref.isPeeled() is true; else a new Ref object representing the same data as Ref, but isPeeled() will be true and getPeeledObjectId will contain the peeled object (or null).
      • getAllRefsByPeeledObjectId

        @NonNull
        public Map<AnyObjectId,​Set<Ref>> getAllRefsByPeeledObjectId()
                                                                   throws IOException
        Get a map with all objects referenced by a peeled ref.
        Returns:
        a map with all objects referenced by a peeled ref.
        Throws:
        IOException
      • getIndexFile

        @NonNull
        public File getIndexFile()
                          throws NoWorkTreeException
        Get the index file location or null if repository isn't local.
        Returns:
        the index file location or null if repository isn't local.
        Throws:
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
      • readDirCache

        @NonNull
        public DirCache readDirCache()
                              throws NoWorkTreeException,
                                     CorruptObjectException,
                                     IOException
        Create a new in-core index representation and read an index from disk.

        The new index will be read before it is returned to the caller. Read failures are reported as exceptions and therefore prevent the method from returning a partially populated index.

        Returns:
        a cache representing the contents of the specified index file (if it exists) or an empty cache if the file does not exist.
        Throws:
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
        IOException - the index file is present but could not be read.
        CorruptObjectException - the index file is using a format or extension that this library does not support.
      • lockDirCache

        @NonNull
        public DirCache lockDirCache()
                              throws NoWorkTreeException,
                                     CorruptObjectException,
                                     IOException
        Create a new in-core index representation, lock it, and read from disk.

        The new index will be locked and then read before it is returned to the caller. Read failures are reported as exceptions and therefore prevent the method from returning a partially populated index.

        Returns:
        a cache representing the contents of the specified index file (if it exists) or an empty cache if the file does not exist.
        Throws:
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
        IOException - the index file is present but could not be read, or the lock could not be obtained.
        CorruptObjectException - the index file is using a format or extension that this library does not support.
      • getRepositoryState

        @NonNull
        public RepositoryState getRepositoryState()
        Get the repository state
        Returns:
        the repository state
      • isValidRefName

        public static boolean isValidRefName​(String refName)
        Check validity of a ref name. It must not contain character that has a special meaning in a Git object reference expression. Some other dangerous characters are also excluded. For portability reasons '\' is excluded
        Parameters:
        refName - a String object.
        Returns:
        true if refName is a valid ref name
      • normalizeBranchName

        public static String normalizeBranchName​(String name)
        Normalizes the passed branch name into a possible valid branch name. The validity of the returned name should be checked by a subsequent call to isValidRefName(String).

        Future implementations of this method could be more restrictive or more lenient about the validity of specific characters in the returned name.

        The current implementation returns the trimmed input string if this is already a valid branch name. Otherwise it returns a trimmed string with special characters not allowed by isValidRefName(String) replaced by hyphens ('-') and blanks replaced by underscores ('_'). Leading and trailing slashes, dots, hyphens, and underscores are removed.

        Parameters:
        name - to normalize
        Returns:
        The normalized name or an empty String if it is null or empty.
        Since:
        4.7
        See Also:
        isValidRefName(String)
      • stripWorkDir

        @NonNull
        public static String stripWorkDir​(File workDir,
                                          File file)
        Strip work dir and return normalized repository path.
        Parameters:
        workDir - Work dir
        file - File whose path shall be stripped of its workdir
        Returns:
        normalized repository relative path or the empty string if the file is not relative to the work directory.
      • isBare

        public boolean isBare()
        Whether this repository is bare
        Returns:
        true if this is bare, which implies it has no working directory.
      • getWorkTree

        @NonNull
        public File getWorkTree()
                         throws NoWorkTreeException
        Get the root directory of the working tree, where files are checked out for viewing and editing.
        Returns:
        the root directory of the working tree, where files are checked out for viewing and editing.
        Throws:
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
      • scanForRepoChanges

        public abstract void scanForRepoChanges()
                                         throws IOException
        Force a scan for changed refs. Fires an IndexChangedEvent(false) if changes are detected.
        Throws:
        IOException
      • notifyIndexChanged

        public abstract void notifyIndexChanged​(boolean internal)
        Notify that the index changed by firing an IndexChangedEvent.
        Parameters:
        internal - true if the index was changed by the same JGit process
        Since:
        5.0
      • shortenRefName

        @NonNull
        public static String shortenRefName​(String refName)
        Get a shortened more user friendly ref name
        Parameters:
        refName - a String object.
        Returns:
        a more user friendly ref name
      • shortenRemoteBranchName

        @Nullable
        public String shortenRemoteBranchName​(String refName)
        Get a shortened more user friendly remote tracking branch name
        Parameters:
        refName - a String object.
        Returns:
        the remote branch name part of refName, i.e. without the refs/remotes/<remote> prefix, if refName represents a remote tracking branch; otherwise null.
        Since:
        3.4
      • getRemoteName

        @Nullable
        public String getRemoteName​(String refName)
        Get remote name
        Parameters:
        refName - a String object.
        Returns:
        the remote name part of refName, i.e. without the refs/remotes/<remote> prefix, if refName represents a remote tracking branch; otherwise null.
        Since:
        3.4
      • getGitwebDescription

        @Nullable
        public String getGitwebDescription()
                                    throws IOException
        Read the GIT_DIR/description file for gitweb.
        Returns:
        description text; null if no description has been configured.
        Throws:
        IOException - description cannot be accessed.
        Since:
        4.6
      • setGitwebDescription

        public void setGitwebDescription​(@Nullable
                                         String description)
                                  throws IOException
        Set the GIT_DIR/description file for gitweb.
        Parameters:
        description - new description; null to clear the description.
        Throws:
        IOException - description cannot be persisted.
        Since:
        4.6
      • readMergeCommitMsg

        @Nullable
        public String readMergeCommitMsg()
                                  throws IOException,
                                         NoWorkTreeException
        Return the information stored in the file $GIT_DIR/MERGE_MSG. In this file operations triggering a merge will store a template for the commit message of the merge commit.
        Returns:
        a String containing the content of the MERGE_MSG file or null if this file doesn't exist
        Throws:
        IOException
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
      • writeMergeCommitMsg

        public void writeMergeCommitMsg​(String msg)
                                 throws IOException
        Write new content to the file $GIT_DIR/MERGE_MSG. In this file operations triggering a merge will store a template for the commit message of the merge commit. If null is specified as message the file will be deleted.
        Parameters:
        msg - the message which should be written or null to delete the file
        Throws:
        IOException
      • readCommitEditMsg

        @Nullable
        public String readCommitEditMsg()
                                 throws IOException,
                                        NoWorkTreeException
        Return the information stored in the file $GIT_DIR/COMMIT_EDITMSG. In this file hooks triggered by an operation may read or modify the current commit message.
        Returns:
        a String containing the content of the COMMIT_EDITMSG file or null if this file doesn't exist
        Throws:
        IOException
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
        Since:
        4.0
      • writeCommitEditMsg

        public void writeCommitEditMsg​(String msg)
                                throws IOException
        Write new content to the file $GIT_DIR/COMMIT_EDITMSG. In this file hooks triggered by an operation may read or modify the current commit message. If null is specified as message the file will be deleted.
        Parameters:
        msg - the message which should be written or null to delete the file
        Throws:
        IOException
        Since:
        4.0
      • readMergeHeads

        @Nullable
        public List<ObjectId> readMergeHeads()
                                      throws IOException,
                                             NoWorkTreeException
        Return the information stored in the file $GIT_DIR/MERGE_HEAD. In this file operations triggering a merge will store the IDs of all heads which should be merged together with HEAD.
        Returns:
        a list of commits which IDs are listed in the MERGE_HEAD file or null if this file doesn't exist. Also if the file exists but is empty null will be returned
        Throws:
        IOException
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
      • writeMergeHeads

        public void writeMergeHeads​(List<? extends ObjectId> heads)
                             throws IOException
        Write new merge-heads into $GIT_DIR/MERGE_HEAD. In this file operations triggering a merge will store the IDs of all heads which should be merged together with HEAD. If null is specified as list of commits the file will be deleted
        Parameters:
        heads - a list of commits which IDs should be written to $GIT_DIR/MERGE_HEAD or null to delete the file
        Throws:
        IOException
      • readCherryPickHead

        @Nullable
        public ObjectId readCherryPickHead()
                                    throws IOException,
                                           NoWorkTreeException
        Return the information stored in the file $GIT_DIR/CHERRY_PICK_HEAD.
        Returns:
        object id from CHERRY_PICK_HEAD file or null if this file doesn't exist. Also if the file exists but is empty null will be returned
        Throws:
        IOException
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
      • writeCherryPickHead

        public void writeCherryPickHead​(ObjectId head)
                                 throws IOException
        Write cherry pick commit into $GIT_DIR/CHERRY_PICK_HEAD. This is used in case of conflicts to store the cherry which was tried to be picked.
        Parameters:
        head - an object id of the cherry commit or null to delete the file
        Throws:
        IOException
      • writeRevertHead

        public void writeRevertHead​(ObjectId head)
                             throws IOException
        Write revert commit into $GIT_DIR/REVERT_HEAD. This is used in case of conflicts to store the revert which was tried to be picked.
        Parameters:
        head - an object id of the revert commit or null to delete the file
        Throws:
        IOException
      • writeOrigHead

        public void writeOrigHead​(ObjectId head)
                           throws IOException
        Write original HEAD commit into $GIT_DIR/ORIG_HEAD.
        Parameters:
        head - an object id of the original HEAD commit or null to delete the file
        Throws:
        IOException
      • readSquashCommitMsg

        @Nullable
        public String readSquashCommitMsg()
                                   throws IOException
        Return the information stored in the file $GIT_DIR/SQUASH_MSG. In this file operations triggering a squashed merge will store a template for the commit message of the squash commit.
        Returns:
        a String containing the content of the SQUASH_MSG file or null if this file doesn't exist
        Throws:
        IOException
        NoWorkTreeException - if this is bare, which implies it has no working directory. See isBare().
      • writeSquashCommitMsg

        public void writeSquashCommitMsg​(String msg)
                                  throws IOException
        Write new content to the file $GIT_DIR/SQUASH_MSG. In this file operations triggering a squashed merge will store a template for the commit message of the squash commit. If null is specified as message the file will be deleted.
        Parameters:
        msg - the message which should be written or null to delete the file
        Throws:
        IOException
      • readRebaseTodo

        @NonNull
        public List<RebaseTodoLine> readRebaseTodo​(String path,
                                                   boolean includeComments)
                                            throws IOException
        Read a file formatted like the git-rebase-todo file. The "done" file is also formatted like the git-rebase-todo file. These files can be found in .git/rebase-merge/ or .git/rebase-append/ folders.
        Parameters:
        path - path to the file relative to the repository's git-dir. E.g. "rebase-merge/git-rebase-todo" or "rebase-append/done"
        includeComments - true if also comments should be reported
        Returns:
        the list of steps
        Throws:
        IOException
        Since:
        3.2
      • writeRebaseTodoFile

        public void writeRebaseTodoFile​(String path,
                                        List<RebaseTodoLine> steps,
                                        boolean append)
                                 throws IOException
        Write a file formatted like a git-rebase-todo file.
        Parameters:
        path - path to the file relative to the repository's git-dir. E.g. "rebase-merge/git-rebase-todo" or "rebase-append/done"
        steps - the steps to be written
        append - whether to append to an existing file or to write a new file
        Throws:
        IOException
        Since:
        3.2
      • getRemoteNames

        @NonNull
        public Set<String> getRemoteNames()
        Get the names of all known remotes
        Returns:
        the names of all known remotes
        Since:
        3.4
      • autoGC

        public void autoGC​(ProgressMonitor monitor)
        Check whether any housekeeping is required; if yes, run garbage collection; if not, exit without performing any work. Some JGit commands run autoGC after performing operations that could create many loose objects.

        Currently this option is supported for repositories of type FileRepository only. See GC.setAuto(boolean) for configuration details.

        Parameters:
        monitor - to report progress
        Since:
        4.6