API Reference
Top-Level
- git.__version__
Current GitPython version.
- git.refresh(path: str | os.PathLike[str] | None = None) None
Convenience method for setting the git executable path.
- Parameters:
path – Optional path to the Git executable. If not absolute, it is resolved immediately, relative to the current directory.
- Note:
The path parameter is usually omitted and cannot be used to specify a custom command whose location is looked up in a path search on each call. See
Git.refresh
for details on how to achieve this.- Note:
This calls
Git.refresh
and sets other global configuration according to the effect of doing so. As such, this function should usually be used instead of usingGit.refresh
orFetchInfo.refresh
directly.- Note:
This function is called automatically, with no arguments, at import time.
Objects.Base
- class git.objects.base.IndexObject(repo: Repo, binsha: bytes, mode: None | int = None, path: None | str | os.PathLike[str] = None)
Base for all objects that can be part of the index file.
The classes representing git object types that can be part of the index file are
Blob
. In addition,Submodule
, which is not really a git object type but can be part of an index file, is also a subclass.- __annotations__ = {}
- __hash__() int
- Returns:
Hash of our path as index items are uniquely identifiable by path, not by their data!
- __init__(repo: Repo, binsha: bytes, mode: None | int = None, path: None | str | os.PathLike[str] = None) None
Initialize a newly instanced
IndexObject
.- Parameters:
repo – The
Repo
we are located in.binsha – 20 byte sha1.
mode – The stat-compatible file mode as
int
. Use thestat
module to evaluate the information.path – The path to the file in the file system, relative to the git repository root, like
file.ext
orfolder/other.ext
.
- Note:
Path may not be set if the index object has been created directly, as it cannot be retrieved without knowing the parent tree.
- __module__ = 'git.objects.base'
- __slots__ = ('path', 'mode')
- property abspath: str | os.PathLike[str]
- Returns:
Absolute path to this index object in the file system (as opposed to the
path
field which is a path relative to the git repository).The returned path will be native to the system and contains
\
on Windows.
- mode
- property name: str
- Returns:
Name portion of the path, effectively being the basename
- path
- class git.objects.base.Object(repo: Repo, binsha: bytes)
Base class for classes representing git object types.
The following four leaf classes represent specific kinds of git objects:
See gitglossary(7) on:
“object type”: https://git-scm.com/docs/gitglossary#def_object_type
“blob”: https://git-scm.com/docs/gitglossary#def_blob_object
“tree object”: https://git-scm.com/docs/gitglossary#def_tree_object
“commit object”: https://git-scm.com/docs/gitglossary#def_commit_object
“tag object”: https://git-scm.com/docs/gitglossary#def_tag_object
- Note:
See the
AnyGitObject
union type of the four leaf subclasses that represent actual git object types.- Note:
Submodule
is defined under the hierarchy rooted at thisObject
class, even though submodules are not really a type of git object. (This also applies to itsRootModule
subclass.)- Note:
This
Object
class should not be confused withobject
(the root of the class hierarchy in Python).
- NULL_BIN_SHA = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
- NULL_HEX_SHA = '0000000000000000000000000000000000000000'
- TYPES = (b'blob', b'tree', b'commit', b'tag')
- __annotations__ = {'type': typing.Optional[typing.Literal['commit', 'tag', 'blob', 'tree']]}
- __eq__(other: Any) bool
- Returns:
True
if the objects have the same SHA1
- __hash__() int
- Returns:
Hash of our id allowing objects to be used in dicts and sets
- __init__(repo: Repo, binsha: bytes) None
Initialize an object by identifying it by its binary sha.
All keyword arguments will be set on demand if
None
.- Parameters:
repo – Repository this object is located in.
binsha – 20 byte SHA1
- __module__ = 'git.objects.base'
- __ne__(other: Any) bool
- Returns:
True
if the objects do not have the same SHA1
- __repr__() str
- Returns:
String with pythonic representation of our object
- __slots__ = ('repo', 'binsha', 'size')
- __str__() str
- Returns:
String of our SHA1 as understood by all git commands
- binsha
- property data_stream: OStream
- Returns:
File-object compatible stream to the uncompressed raw data of the object
- Note:
Returned streams must be read in order.
- property hexsha: str
- Returns:
40 byte hex version of our 20 byte binary sha
- classmethod new(repo: Repo, id: str | Reference) Commit | Tree | TagObject | Blob
- Returns:
New
Object
instance of a type appropriate to the object type behind id. The id of the newly created object will be a binsha even though the input id may have been a ~git.refs.reference.Reference or rev-spec.- Parameters:
id –
Reference
, rev-spec, or hexsha.- Note:
This cannot be a
__new__
method as it would always call__init__()
with the input id which is not necessarily a binsha.
- classmethod new_from_sha(repo: Repo, sha1: bytes) Commit | Tree | TagObject | Blob
- Returns:
New object instance of a type appropriate to represent the given binary sha1
- Parameters:
sha1 – 20 byte binary sha1.
- repo
- size
- stream_data(ostream: OStream) Object
Write our data directly to the given output stream.
- Parameters:
ostream – File-object compatible stream object.
- Returns:
self
- type: Literal['commit', 'tag', 'blob', 'tree'] | None = None
String identifying (a concrete
Object
subtype for) a git object type.The subtypes that this may name correspond to the kinds of git objects that exist, i.e., the objects that may be present in a git repository.
- Note:
Most subclasses represent specific types of git objects and override this class attribute accordingly. This attribute is
None
in theObject
base class, as well as theIndexObject
intermediate subclass, but neverNone
in concrete leaf subclasses representing specific git object types.- Note:
See also
GitObjectTypeString
.
Objects.Blob
- class git.objects.blob.Blob(repo: Repo, binsha: bytes, mode: None | int = None, path: None | str | os.PathLike[str] = None)
A Blob encapsulates a git blob object.
See gitglossary(7) on “blob”: https://git-scm.com/docs/gitglossary#def_blob_object
- DEFAULT_MIME_TYPE = 'text/plain'
- __annotations__ = {'type': typing.Literal['blob']}
- __module__ = 'git.objects.blob'
- __slots__ = ()
- executable_mode = 33261
- file_mode = 33188
- link_mode = 40960
- property mime_type: str
- Returns:
String describing the mime type of this file (based on the filename)
- Note:
Defaults to
text/plain
in case the actual file type is unknown.
- type: Literal['blob'] = 'blob'
String identifying (a concrete
Object
subtype for) a git object type.The subtypes that this may name correspond to the kinds of git objects that exist, i.e., the objects that may be present in a git repository.
- Note:
Most subclasses represent specific types of git objects and override this class attribute accordingly. This attribute is
None
in theObject
base class, as well as theIndexObject
intermediate subclass, but neverNone
in concrete leaf subclasses representing specific git object types.- Note:
See also
GitObjectTypeString
.
Objects.Commit
- class git.objects.commit.Commit(repo: Repo, binsha: bytes, tree: Tree | None = None, author: Actor | None = None, authored_date: int | None = None, author_tz_offset: None | float = None, committer: Actor | None = None, committed_date: int | None = None, committer_tz_offset: None | float = None, message: str | bytes | None = None, parents: Sequence[Commit] | None = None, encoding: str | None = None, gpgsig: str | None = None)
Wraps a git commit object.
See gitglossary(7) on “commit object”: https://git-scm.com/docs/gitglossary#def_commit_object
- Note:
This class will act lazily on some of its attributes and will query the value on demand only if it involves calling the git binary.
- __abstractmethods__ = frozenset({})
- __annotations__ = {'_id_attribute_': 'str', 'parents': typing.Sequence[ForwardRef('Commit')], 'repo': "'Repo'", 'type': typing.Literal['commit']}
- __init__(repo: Repo, binsha: bytes, tree: Tree | None = None, author: Actor | None = None, authored_date: int | None = None, author_tz_offset: None | float = None, committer: Actor | None = None, committed_date: int | None = None, committer_tz_offset: None | float = None, message: str | bytes | None = None, parents: Sequence[Commit] | None = None, encoding: str | None = None, gpgsig: str | None = None) None
Instantiate a new
Commit
. All keyword arguments takingNone
as default will be implicitly set on first query.- Parameters:
binsha – 20 byte sha1.
tree – A
Tree
object.author – The author
Actor
object.authored_date – int_seconds_since_epoch The authored DateTime - use
time.gmtime()
to convert it into a different format.author_tz_offset – int_seconds_west_of_utc The timezone that the authored_date is in.
committer – The committer string, as an
Actor
object.committed_date – int_seconds_since_epoch The committed DateTime - use
time.gmtime()
to convert it into a different format.committer_tz_offset – int_seconds_west_of_utc The timezone that the committed_date is in.
message – string The commit message.
encoding – string Encoding of the message, defaults to UTF-8.
parents – List or tuple of
Commit
objects which are our parent(s) in the commit dependency graph.
- Returns:
- Note:
Timezone information is in the same format and in the same sign as what
time.altzone()
returns. The sign is inverted compared to git’s UTC timezone.
- __module__ = 'git.objects.commit'
- __parameters__ = ()
- __slots__ = ('tree', 'author', 'authored_date', 'author_tz_offset', 'committer', 'committed_date', 'committer_tz_offset', 'message', 'parents', 'encoding', 'gpgsig')
- classmethod __subclasshook__(other)
Abstract classes can override this to customize issubclass().
This is invoked early on by abc.ABCMeta.__subclasscheck__(). It should return True, False or NotImplemented. If it returns NotImplemented, the normal algorithm is used. Otherwise, it overrides the normal algorithm (and the outcome is cached).
- author
- author_tz_offset
- authored_date
- property authored_datetime: datetime
- property co_authors: List[Actor]
Search the commit message for any co-authors of this commit.
Details on co-authors: https://github.blog/2018-01-29-commit-together-with-co-authors/
- Returns:
List of co-authors for this commit (as
Actor
objects).
- committed_date
- property committed_datetime: datetime
- committer
- committer_tz_offset
- conf_encoding = 'i18n.commitencoding'
- count(paths: str | PathLike[str] | Sequence[str | PathLike[str]] = '', **kwargs: Any) int
Count the number of commits reachable from this commit.
- Parameters:
paths – An optional path or a list of paths restricting the return value to commits actually containing the paths.
kwargs – Additional options to be passed to git-rev-list(1). They must not alter the output style of the command, or parsing will yield incorrect results.
- Returns:
An int defining the number of reachable commits
- classmethod create_from_tree(repo: Repo, tree: Tree | str, message: str, parent_commits: None | List[Commit] = None, head: bool = False, author: None | Actor = None, committer: None | Actor = None, author_date: None | str | datetime = None, commit_date: None | str | datetime = None) Commit
Commit the given tree, creating a
Commit
object.- Parameters:
repo –
Repo
object the commit should be part of.tree –
Tree
object or hex or bin sha. The tree of the new commit.message – Commit message. It may be an empty string if no message is provided. It will be converted to a string, in any case.
parent_commits – Optional
Commit
objects to use as parents for the new commit. If empty list, the commit will have no parents at all and become a root commit. IfNone
, the current head commit will be the parent of the new commit object.head – If
True
, the HEAD will be advanced to the new commit automatically. Otherwise the HEAD will remain pointing on the previous commit. This could lead to undesired results when diffing files.author – The name of the author, optional. If unset, the repository configuration is used to obtain this value.
committer – The name of the committer, optional. If unset, the repository configuration is used to obtain this value.
author_date – The timestamp for the author field.
commit_date – The timestamp for the committer field.
- Returns:
Commit
object representing the new commit.- Note:
Additional information about the committer and author are taken from the environment or from the git configuration. See git-commit-tree(1) for more information.
- default_encoding = 'UTF-8'
- encoding
- env_author_date = 'GIT_AUTHOR_DATE'
- env_committer_date = 'GIT_COMMITTER_DATE'
- gpgsig
- classmethod iter_items(repo: Repo, rev: str | Commit | SymbolicReference, paths: str | os.PathLike[str] | Sequence[str | os.PathLike[str]] = '', **kwargs: Any) Iterator[Commit]
Find all commits matching the given criteria.
- Parameters:
repo – The
Repo
.rev – Revision specifier. See git-rev-parse(1) for viable options.
paths – An optional path or list of paths. If set only
Commit
s that include the path or paths will be considered.kwargs –
Optional keyword arguments to git-rev-list(1) where:
max_count
is the maximum number of commits to fetch.skip
is the number of commits to skip.since
selects all commits since some date, e.g."1970-01-01"
.
- Returns:
Iterator yielding
Commit
items.
- iter_parents(paths: str | PathLike[str] | Sequence[str | PathLike[str]] = '', **kwargs: Any) Iterator[Commit]
Iterate _all_ parents of this commit.
- Parameters:
paths – Optional path or list of paths limiting the
Commit
s to those that contain at least one of the paths.kwargs – All arguments allowed by git-rev-list(1).
- Returns:
Iterator yielding
Commit
objects which are parents ofself
- message
- property name_rev: str
- Returns:
String describing the commits hex sha based on the closest ~git.refs.reference.Reference.
- Note:
Mostly useful for UI purposes.
- replace(**kwargs: Any) Commit
Create new commit object from an existing commit object.
Any values provided as keyword arguments will replace the corresponding attribute in the new object.
- property stats: Stats
Create a git stat from changes between this commit and its first parent or from all changes done if this is the very first commit.
- Returns:
Stats
- property summary: str | bytes
- Returns:
First line of the commit message
- property trailers: Dict[str, str]
Deprecated. Get the trailers of the message as a dictionary.
- Note:
This property is deprecated, please use either
trailers_list
ortrailers_dict
.- Returns:
Dictionary containing whitespace stripped trailer information. Only contains the latest instance of each trailer key.
- property trailers_dict: Dict[str, List[str]]
Get the trailers of the message as a dictionary.
Git messages can contain trailer information that are similar to RFC 822 e-mail headers. See git-interpret-trailers(1).
This function calls
git interpret-trailers --parse
onto the message to extract the trailer information. The key value pairs are stripped of leading and trailing whitespaces before they get saved into a dictionary.Valid message with trailer:
Subject line some body information another information key1: value1.1 key1: value1.2 key2 : value 2 with inner spaces
Returned dictionary will look like this:
{ "key1": ["value1.1", "value1.2"], "key2": ["value 2 with inner spaces"], }
- Returns:
Dictionary containing whitespace stripped trailer information, mapping trailer keys to a list of their corresponding values.
- property trailers_list: List[Tuple[str, str]]
Get the trailers of the message as a list.
Git messages can contain trailer information that are similar to RFC 822 e-mail headers. See git-interpret-trailers(1).
This function calls
git interpret-trailers --parse
onto the message to extract the trailer information, returns the raw trailer data as a list.Valid message with trailer:
Subject line some body information another information key1: value1.1 key1: value1.2 key2 : value 2 with inner spaces
Returned list will look like this:
[ ("key1", "value1.1"), ("key1", "value1.2"), ("key2", "value 2 with inner spaces"), ]
- Returns:
List containing key-value tuples of whitespace stripped trailer information.
- tree
- type: Literal['commit'] = 'commit'
String identifying (a concrete
Object
subtype for) a git object type.The subtypes that this may name correspond to the kinds of git objects that exist, i.e., the objects that may be present in a git repository.
- Note:
Most subclasses represent specific types of git objects and override this class attribute accordingly. This attribute is
None
in theObject
base class, as well as theIndexObject
intermediate subclass, but neverNone
in concrete leaf subclasses representing specific git object types.- Note:
See also
GitObjectTypeString
.
Objects.Tag
Provides an Object
-based type for annotated tags.
This defines the TagObject
class, which represents annotated tags.
For lightweight tags, see the git.refs.tag
module.
- class git.objects.tag.TagObject(repo: Repo, binsha: bytes, object: None | Object = None, tag: None | str = None, tagger: None | Actor = None, tagged_date: int | None = None, tagger_tz_offset: int | None = None, message: str | None = None)
Annotated (i.e. non-lightweight) tag carrying additional information about an object we are pointing to.
See gitglossary(7) on “tag object”: https://git-scm.com/docs/gitglossary#def_tag_object
- __annotations__ = {'type': typing.Literal['tag']}
- __init__(repo: Repo, binsha: bytes, object: None | Object = None, tag: None | str = None, tagger: None | Actor = None, tagged_date: int | None = None, tagger_tz_offset: int | None = None, message: str | None = None) None
Initialize a tag object with additional data.
- Parameters:
repo – Repository this object is located in.
binsha – 20 byte SHA1.
object –
Object
instance of object we are pointing to.tag – Name of this tag.
tagger –
Actor
identifying the tagger.tagged_date – int_seconds_since_epoch The DateTime of the tag creation. Use
time.gmtime()
to convert it into a different format.tagger_tz_offset – int_seconds_west_of_utc The timezone that the tagged_date is in, in a format similar to
time.altzone
.
- __module__ = 'git.objects.tag'
- __slots__ = ('object', 'tag', 'tagger', 'tagged_date', 'tagger_tz_offset', 'message')
- message
- object: 'Commit' | 'Blob' | 'Tree' | 'TagObject'
- tag
- tagged_date
- tagger
- tagger_tz_offset
- type: Literal['tag'] = 'tag'
String identifying (a concrete
Object
subtype for) a git object type.The subtypes that this may name correspond to the kinds of git objects that exist, i.e., the objects that may be present in a git repository.
- Note:
Most subclasses represent specific types of git objects and override this class attribute accordingly. This attribute is
None
in theObject
base class, as well as theIndexObject
intermediate subclass, but neverNone
in concrete leaf subclasses representing specific git object types.- Note:
See also
GitObjectTypeString
.
Objects.Tree
- class git.objects.tree.Tree(repo: Repo, binsha: bytes, mode: int = 16384, path: str | os.PathLike[str] | None = None)
Tree objects represent an ordered list of
Blob
s and otherTree
s.See gitglossary(7) on “tree object”: https://git-scm.com/docs/gitglossary#def_tree_object
Subscripting is supported, as with a list or dict:
Access a specific blob using the
tree["filename"]
notation.You may likewise access by index, like
blob = tree[0]
.
- __abstractmethods__ = frozenset({})
- __annotations__ = {'_map_id_to_type': typing.Dict[int, typing.Type[typing.Union[ForwardRef('Tree'), ForwardRef('Blob'), ForwardRef('Submodule')]]], 'repo': "'Repo'", 'type': typing.Literal['tree']}
- __init__(repo: Repo, binsha: bytes, mode: int = 16384, path: str | os.PathLike[str] | None = None)
Initialize a newly instanced
IndexObject
.- Parameters:
repo – The
Repo
we are located in.binsha – 20 byte sha1.
mode – The stat-compatible file mode as
int
. Use thestat
module to evaluate the information.path – The path to the file in the file system, relative to the git repository root, like
file.ext
orfolder/other.ext
.
- Note:
Path may not be set if the index object has been created directly, as it cannot be retrieved without knowing the parent tree.
- __len__() int
- __module__ = 'git.objects.tree'
- __slots__ = ('_cache',)
- __truediv__(file: str) Tree | Blob | Submodule
The
/
operator is another syntax for joining.See
join()
for details.
- blob_id = 8
- property cache: TreeModifier
- Returns:
An object allowing modification of the internal cache. This can be used to change the tree’s contents. When done, make sure you call
set_done()
on the tree modifier, or serialization behaviour will be incorrect.- Note:
See
TreeModifier
for more information on how to alter the cache.
- commit_id = 14
- list_traverse(*args: Any, **kwargs: Any) IterableList[Tree | Blob | Submodule]
- Returns:
IterableList
with the results of the traversal as produced bytraverse()
Tree -> IterableList[Union[Submodule, Tree, Blob]]
- symlink_id = 10
- traverse(predicate: ~typing.Callable[[~git.objects.tree.Tree | ~git.objects.blob.Blob | ~git.objects.submodule.base.Submodule | ~typing.Tuple[~git.objects.tree.Tree | None, ~git.objects.tree.Tree | ~git.objects.blob.Blob | ~git.objects.submodule.base.Submodule, ~typing.Tuple[~git.objects.submodule.base.Submodule, ~git.objects.submodule.base.Submodule]], int], bool] = <function Tree.<lambda>>, prune: ~typing.Callable[[~git.objects.tree.Tree | ~git.objects.blob.Blob | ~git.objects.submodule.base.Submodule | ~typing.Tuple[~git.objects.tree.Tree | None, ~git.objects.tree.Tree | ~git.objects.blob.Blob | ~git.objects.submodule.base.Submodule, ~typing.Tuple[~git.objects.submodule.base.Submodule, ~git.objects.submodule.base.Submodule]], int], bool] = <function Tree.<lambda>>, depth: int = -1, branch_first: bool = True, visit_once: bool = False, ignore_self: int = 1, as_edge: bool = False) Iterator[Tree | Blob | Submodule] | Iterator[Tuple[Tree | None, Tree | Blob | Submodule, Tuple[Submodule, Submodule]]]
For documentation, see Traversable._traverse() <git.objects.util.Traversable._traverse>.
Trees are set to
visit_once = False
to gain more performance in the traversal.
- tree_id = 4
- type: Literal['tree'] = 'tree'
String identifying (a concrete
Object
subtype for) a git object type.The subtypes that this may name correspond to the kinds of git objects that exist, i.e., the objects that may be present in a git repository.
- Note:
Most subclasses represent specific types of git objects and override this class attribute accordingly. This attribute is
None
in theObject
base class, as well as theIndexObject
intermediate subclass, but neverNone
in concrete leaf subclasses representing specific git object types.- Note:
See also
GitObjectTypeString
.
- class git.objects.tree.TreeModifier(cache: List[Tuple[bytes, int, str]])
A utility class providing methods to alter the underlying cache in a list-like fashion.
Once all adjustments are complete, the
_cache
, which really is a reference to the cache of a tree, will be sorted. This ensures it will be in a serializable state.- __delitem__(name: str) None
Delete an item with the given name if it exists.
- __init__(cache: List[Tuple[bytes, int, str]]) None
- __module__ = 'git.objects.tree'
- __slots__ = ('_cache',)
- add(sha: bytes, mode: int, name: str, force: bool = False) TreeModifier
Add the given item to the tree.
If an item with the given name already exists, nothing will be done, but a
ValueError
will be raised if the sha and mode of the existing item do not match the one you add, unless force isTrue
.- Parameters:
sha – The 20 or 40 byte sha of the item to add.
mode –
int
representing the stat-compatible mode of the item.force – If
True
, an item with your name and information will overwrite any existing item with the same name, no matter which information it has.
- Returns:
self
- add_unchecked(binsha: bytes, mode: int, name: str) None
Add the given item to the tree. Its correctness is assumed, so it is the caller’s responsibility to ensure that the input is correct.
For more information on the parameters, see
add()
.- Parameters:
binsha – 20 byte binary sha.
- set_done() TreeModifier
Call this method once you are done modifying the tree information.
This may be called several times, but be aware that each call will cause a sort operation.
- Returns:
self
Objects.Functions
Functions that are supposed to be as fast as possible.
- git.objects.fun.traverse_tree_recursive(odb: GitCmdObjectDB, tree_sha: bytes, path_prefix: str) List[Tuple[bytes, int, str]]
- Returns:
List of entries of the tree pointed to by the binary tree_sha.
An entry has the following format:
[0] 20 byte sha
[1] mode as int
[2] path relative to the repository
- Parameters:
path_prefix – Prefix to prepend to the front of all returned paths.
- git.objects.fun.traverse_trees_recursive(odb: GitCmdObjectDB, tree_shas: Sequence[bytes | None], path_prefix: str) List[Tuple[Tuple[bytes, int, str] | None, ...]]
- Returns:
List of list with entries according to the given binary tree-shas.
The result is encoded in a list of n tuple|None per blob/commit, (n == len(tree_shas)), where:
[0] == 20 byte sha
[1] == mode as int
[2] == path relative to working tree root
The entry tuple is
None
if the respective blob/commit did not exist in the given tree.- Parameters:
tree_shas – Iterable of shas pointing to trees. All trees must be on the same level. A tree-sha may be
None
, in which caseNone
.path_prefix – A prefix to be added to the returned paths on this level. Set it
""
for the first iteration.
- Note:
The ordering of the returned items will be partially lost.
- git.objects.fun.tree_entries_from_data(data: bytes) List[Tuple[bytes, int, str]]
Read the binary representation of a tree and returns tuples of
Tree
items.- Parameters:
data – Data block with tree data (as bytes).
- Returns:
list(tuple(binsha, mode, tree_relative_path), …)
- git.objects.fun.tree_to_stream(entries: Sequence[Tuple[bytes, int, str]], write: Callable[[ReadableBuffer], int | None]) None
Write the given list of entries into a stream using its
write
method.- Parameters:
entries – Sorted list of tuples with (binsha, mode, name).
write – A
write
method which takes a data string.
Objects.Submodule.base
- class git.objects.submodule.base.Submodule(repo: Repo, binsha: bytes, mode: int | None = None, path: str | os.PathLike[str] | None = None, name: str | None = None, parent_commit: Commit | None = None, url: str | None = None, branch_path: str | os.PathLike[str] | None = None)
Implements access to a git submodule. They are special in that their sha represents a commit in the submodule’s repository which is to be checked out at the path of this instance.
The submodule type does not have a string type associated with it, as it exists solely as a marker in the tree and index.
All methods work in bare and non-bare repositories.
- __abstractmethods__ = frozenset({})
- __annotations__ = {'_id_attribute_': 'str', 'type': typing.Literal['submodule']}
- __eq__(other: Any) bool
Compare with another submodule.
- __hash__() int
Hash this instance using its logical id, not the sha.
- __init__(repo: Repo, binsha: bytes, mode: int | None = None, path: str | os.PathLike[str] | None = None, name: str | None = None, parent_commit: Commit | None = None, url: str | None = None, branch_path: str | os.PathLike[str] | None = None) None
Initialize this instance with its attributes.
We only document the parameters that differ from
IndexObject
.- Parameters:
repo – Our parent repository.
binsha – Binary sha referring to a commit in the remote repository. See the url parameter.
parent_commit – The
Commit
whose tree is supposed to contain the.gitmodules
blob, orNone
to always point to the most recent commit. Seeset_parent_commit()
for details.url – The URL to the remote repository which is the submodule.
branch_path – Full repository-relative path to ref to checkout when cloning the remote repository.
- __module__ = 'git.objects.submodule.base'
- __ne__(other: object) bool
Compare with another submodule for inequality.
- __parameters__ = ()
- __repr__() str
- Returns:
String with pythonic representation of our object
- __slots__ = ('_parent_commit', '_url', '_branch_path', '_name', '__weakref__')
- __str__() str
- Returns:
String of our SHA1 as understood by all git commands
- classmethod __subclasshook__(other)
Abstract classes can override this to customize issubclass().
This is invoked early on by abc.ABCMeta.__subclasscheck__(). It should return True, False or NotImplemented. If it returns NotImplemented, the normal algorithm is used. Otherwise, it overrides the normal algorithm (and the outcome is cached).
- __weakref__
- classmethod add(repo: Repo, name: str, path: str | os.PathLike[str], url: str | None = None, branch: str | None = None, no_checkout: bool = False, depth: int | None = None, env: Mapping[str, str] | None = None, clone_multi_options: Sequence[Any] | None = None, allow_unsafe_options: bool = False, allow_unsafe_protocols: bool = False) Submodule
Add a new submodule to the given repository. This will alter the index as well as the
.gitmodules
file, but will not create a new commit. If the submodule already exists, no matter if the configuration differs from the one provided, the existing submodule will be returned.- Parameters:
repo – Repository instance which should receive the submodule.
name – The name/identifier for the submodule.
path – Repository-relative or absolute path at which the submodule should be located. It will be created as required during the repository initialization.
url –
git clone ...
-compatible URL. See git-clone(1) for more information. IfNone
, the repository is assumed to exist, and the URL of the first remote is taken instead. This is useful if you want to make an existing repository a submodule of another one.branch – Name of branch at which the submodule should (later) be checked out. The given branch must exist in the remote repository, and will be checked out locally as a tracking branch. It will only be written into the configuration if it not
None
, which is when the checked out branch will be the one the remote HEAD pointed to. The result you get in these situation is somewhat fuzzy, and it is recommended to specify at leastmaster
here. Examples aremaster
orfeature/new
.no_checkout – If
True
, and if the repository has to be cloned manually, no checkout will be performed.depth – Create a shallow clone with a history truncated to the specified number of commits.
env –
Optional dictionary containing the desired environment variables.
Note: Provided variables will be used to update the execution environment for
git
. If some variable is not specified in env and is defined in attr:os.environ, the value from attr:os.environ will be used. If you want to unset some variable, consider providing an empty string as its value.clone_multi_options – A list of clone options. Please see
Repo.clone
for details.allow_unsafe_protocols – Allow unsafe protocols to be used, like
ext
.allow_unsafe_options – Allow unsafe options to be used, like
--upload-pack
.
- Returns:
The newly created
Submodule
instance.- Note:
Works atomically, such that no change will be done if, for example, the repository update fails.
- property branch: Head
- Returns:
The branch instance that we are to checkout
- Raises:
git.exc.InvalidGitRepositoryError – If our module is not yet checked out.
- property branch_name: str
- Returns:
The name of the branch, which is the shortest possible branch name
- property branch_path: str | PathLike[str]
- Returns:
Full repository-relative path as string to the branch we would checkout from the remote and track
- children() IterableList[Submodule]
- Returns:
IterableList(Submodule, …) An iterable list of
Submodule
instances which are children of this submodule or 0 if the submodule is not checked out.
- config_reader() SectionConstraint[SubmoduleConfigParser]
- Returns:
ConfigReader instance which allows you to query the configuration values of this submodule, as provided by the
.gitmodules
file.- Note:
The config reader will actually read the data directly from the repository and thus does not need nor care about your working tree.
- Note:
Should be cached by the caller and only kept as long as needed.
- Raises:
IOError – If the
.gitmodules
file/blob could not be read.
- config_writer(index: IndexFile | None = None, write: bool = True) SectionConstraint[SubmoduleConfigParser]
- Returns:
A config writer instance allowing you to read and write the data belonging to this submodule into the
.gitmodules
file.- Parameters:
- Note:
The parameters allow for a more efficient writing of the index, as you can pass in a modified index on your own, prevent automatic writing, and write yourself once the whole operation is complete.
- Raises:
ValueError – If trying to get a writer on a parent_commit which does not match the current head commit.
IOError – If the
.gitmodules
file/blob could not be read.
- exists() bool
- Returns:
True
if the submodule exists,False
otherwise. Please note that a submodule may exist (in the.gitmodules
file) even though its module doesn’t exist on disk.
- classmethod iter_items(repo: Repo, parent_commit: Commit | TagObject | str = 'HEAD', *args: Any, **kwargs: Any) Iterator[Submodule]
- Returns:
Iterator yielding
Submodule
instances available in the given repository
- k_default_mode = 57344
Submodule flags. Submodules are directories with link-status.
- k_head_default = 'master'
- k_head_option = 'branch'
- k_modules_file = '.gitmodules'
- module() Repo
- Returns:
Repo
instance initialized from the repository at our submodule path- Raises:
git.exc.InvalidGitRepositoryError – If a repository was not available. This could also mean that it was not yet initialized.
- module_exists() bool
- Returns:
True
if our module exists and is a valid git repository. See themodule()
method.
- move(module_path: str | PathLike[str], configuration: bool = True, module: bool = True) Submodule
Move the submodule to a another module path. This involves physically moving the repository at our current path, changing the configuration, as well as adjusting our index entry accordingly.
- Parameters:
module_path – The path to which to move our module in the parent repository’s working tree, given as repository-relative or absolute path. Intermediate directories will be created accordingly. If the path already exists, it must be empty. Trailing (back)slashes are removed automatically.
configuration – If
True
, the configuration will be adjusted to let the submodule point to the given path.module – If
True
, the repository managed by this submodule will be moved as well. IfFalse
, we don’t move the submodule’s checkout, which may leave the parent repository in an inconsistent state.
- Returns:
self
- Raises:
ValueError – If the module path existed and was not empty, or was a file.
- Note:
Currently the method is not atomic, and it could leave the repository in an inconsistent state if a sub-step fails for some reason.
- property name: str
- Returns:
The name of this submodule. It is used to identify it within the
.gitmodules
file.- Note:
By default, this is the name is the path at which to find the submodule, but in GitPython it should be a unique identifier similar to the identifiers used for remotes, which allows to change the path of the submodule easily.
- property parent_commit: Commit
- Returns:
Commit
instance with the tree containing the.gitmodules
file- Note:
Will always point to the current head’s commit if it was not set explicitly.
- remove(module: bool = True, force: bool = False, configuration: bool = True, dry_run: bool = False) Submodule
Remove this submodule from the repository. This will remove our entry from the
.gitmodules
file and the entry in the.git/config
file.- Parameters:
module –
If
True
, the checked out module we point to will be deleted as well. If that module is currently on a commit outside any branch in the remote, or if it is ahead of its tracking branch, or if there are modified or untracked files in its working tree, then the removal will fail. In case the removal of the repository fails for these reasons, the submodule status will not have been altered.If this submodule has child modules of its own, these will be deleted prior to touching the direct submodule.
force – Enforces the deletion of the module even though it contains modifications. This basically enforces a brute-force file system based deletion.
configuration – If
True
, the submodule is deleted from the configuration, otherwise it isn’t. Although this should be enabled most of the time, this flag enables you to safely delete the repository of your submodule.dry_run – If
True
, we will not actually do anything, but throw the errors we would usually throw.
- Returns:
self
- Note:
Doesn’t work in bare repositories.
- Note:
Doesn’t work atomically, as failure to remove any part of the submodule will leave an inconsistent state.
- Raises:
git.exc.InvalidGitRepositoryError – Thrown if the repository cannot be deleted.
OSError – If directories or files could not be removed.
- rename(new_name: str) Submodule
Rename this submodule.
- Note:
This method takes care of renaming the submodule in various places, such as:
$parent_git_dir / config
$working_tree_dir / .gitmodules
(git >= v1.8.0: move submodule repository to new name)
As
.gitmodules
will be changed, you would need to make a commit afterwards. The changed.gitmodules
file will already be added to the index.- Returns:
This
Submodule
instance
- set_parent_commit(commit: Commit | TagObject | str | None, check: bool = True) Submodule
Set this instance to use the given commit whose tree is supposed to contain the
.gitmodules
blob.- Parameters:
commit – Commit-ish reference pointing at the root tree, or
None
to always point to the most recent commit.check – If
True
, relatively expensive checks will be performed to verify validity of the submodule.
- Raises:
ValueError – If the commit’s tree didn’t contain the
.gitmodules
blob.ValueError – If the parent commit didn’t store this submodule under the current path.
- Returns:
self
- type: Literal['submodule'] = 'submodule'
This is a bogus type string for base class compatibility.
- update(recursive: bool = False, init: bool = True, to_latest_revision: bool = False, progress: UpdateProgress | None = None, dry_run: bool = False, force: bool = False, keep_going: bool = False, env: Mapping[str, str] | None = None, clone_multi_options: Sequence[Any] | None = None, allow_unsafe_options: bool = False, allow_unsafe_protocols: bool = False) Submodule
Update the repository of this submodule to point to the checkout we point at with the binsha of this instance.
- Parameters:
recursive – If
True
, we will operate recursively and update child modules as well.init – If
True
, the module repository will be cloned into place if necessary.to_latest_revision – If
True
, the submodule’s sha will be ignored during checkout. Instead, the remote will be fetched, and the local tracking branch updated. This only works if we have a local tracking branch, which is the case if the remote repository had a master branch, or if thebranch
option was specified for this submodule and the branch existed remotely.progress –
UpdateProgress
instance, orNone
if no progress should be shown.dry_run – If
True
, the operation will only be simulated, but not performed. All performed operations are read-only.force –
If
True
, we may reset heads even if the repository in question is dirty. Additionally we will be allowed to set a tracking branch which is ahead of its remote branch back into the past or the location of the remote branch. This will essentially ‘forget’ commits.If
False
, local tracking branches that are in the future of their respective remote branches will simply not be moved.keep_going – If
True
, we will ignore but log all errors, and keep going recursively. Unless dry_run is set as well, keep_going could cause subsequent/inherited errors you wouldn’t see otherwise. In conjunction with dry_run, it can be useful to anticipate all errors when updating submodules.env –
Optional dictionary containing the desired environment variables.
Note: Provided variables will be used to update the execution environment for
git
. If some variable is not specified in env and is defined in attr:os.environ, value from attr:os.environ will be used.If you want to unset some variable, consider providing the empty string as its value.
clone_multi_options – List of git-clone(1) options. Please see
Repo.clone
for details. They only take effect with the init option.allow_unsafe_protocols – Allow unsafe protocols to be used, like
ext
.allow_unsafe_options – Allow unsafe options to be used, like
--upload-pack
.
- Note:
Does nothing in bare repositories.
- Note:
This method is definitely not atomic if recursive is
True
.- Returns:
self
- property url: str
- Returns:
The url to the repository our submodule’s repository refers to
- class git.objects.submodule.base.UpdateProgress
Class providing detailed progress information to the caller who should derive from it and implement the
update(...)
message.- CLONE = 512
- FETCH = 1024
- UPDWKTREE = 2048
- __annotations__ = {'_cur_line': 'Optional[str]', '_num_op_codes': <class 'int'>, '_seen_ops': 'List[int]', 'error_lines': 'List[str]', 'other_lines': 'List[str]'}
- __module__ = 'git.objects.submodule.base'
- __slots__ = ()
Objects.Submodule.root
- class git.objects.submodule.root.RootModule(repo: Repo)
A (virtual) root of all submodules in the given repository.
This can be used to more easily traverse all submodules of the superproject (master repository).
- __abstractmethods__ = frozenset({})
- __annotations__ = {'_id_attribute_': 'str', 'type': "Literal['submodule']"}
- __init__(repo: Repo) None
Initialize this instance with its attributes.
We only document the parameters that differ from
IndexObject
.- Parameters:
repo – Our parent repository.
binsha – Binary sha referring to a commit in the remote repository. See the url parameter.
parent_commit – The
Commit
whose tree is supposed to contain the.gitmodules
blob, orNone
to always point to the most recent commit. Seeset_parent_commit()
for details.url – The URL to the remote repository which is the submodule.
branch_path – Full repository-relative path to ref to checkout when cloning the remote repository.
- __module__ = 'git.objects.submodule.root'
- __parameters__ = ()
- __slots__ = ()
- classmethod __subclasshook__(other)
Abstract classes can override this to customize issubclass().
This is invoked early on by abc.ABCMeta.__subclasscheck__(). It should return True, False or NotImplemented. If it returns NotImplemented, the normal algorithm is used. Otherwise, it overrides the normal algorithm (and the outcome is cached).
- k_root_name = '__ROOT__'
- update(previous_commit: Commit | TagObject | str | None = None, recursive: bool = True, force_remove: bool = False, init: bool = True, to_latest_revision: bool = False, progress: None | RootUpdateProgress = None, dry_run: bool = False, force_reset: bool = False, keep_going: bool = False) RootModule
Update the submodules of this repository to the current HEAD commit.
This method behaves smartly by determining changes of the path of a submodule’s repository, next to changes to the to-be-checked-out commit or the branch to be checked out. This works if the submodule’s ID does not change.
Additionally it will detect addition and removal of submodules, which will be handled gracefully.
- Parameters:
previous_commit – If set to a commit-ish, the commit we should use as the previous commit the HEAD pointed to before it was set to the commit it points to now. If
None
, it defaults toHEAD@{1}
otherwise.recursive – If
True
, the children of submodules will be updated as well using the same technique.force_remove – If submodules have been deleted, they will be forcibly removed. Otherwise the update may fail if a submodule’s repository cannot be deleted as changes have been made to it. (See
Submodule.update
for more information.)init – If we encounter a new module which would need to be initialized, then do it.
to_latest_revision –
If
True
, instead of checking out the revision pointed to by this submodule’s sha, the checked out tracking branch will be merged with the latest remote branch fetched from the repository’s origin.Unless force_reset is specified, a local tracking branch will never be reset into its past, therefore the remote branch must be in the future for this to have an effect.
force_reset – If
True
, submodules may checkout or reset their branch even if the repository has pending changes that would be overwritten, or if the local tracking branch is in the future of the remote tracking branch and would be reset into its past.progress –
RootUpdateProgress
instance, orNone
if no progress should be sent.dry_run – If
True
, operations will not actually be performed. Progress messages will change accordingly to indicate the WOULD DO state of the operation.keep_going – If
True
, we will ignore but log all errors, and keep going recursively. Unless dry_run is set as well, keep_going could cause subsequent/inherited errors you wouldn’t see otherwise. In conjunction with dry_run, this can be useful to anticipate all errors when updating submodules.
- Returns:
self
- class git.objects.submodule.root.RootUpdateProgress
Utility class which adds more opcodes to
UpdateProgress
.- BRANCHCHANGE = 16384
- PATHCHANGE = 8192
- REMOVE = 4096
- URLCHANGE = 32768
- __annotations__ = {'_cur_line': 'Optional[str]', '_num_op_codes': 'int', '_seen_ops': 'List[int]', 'error_lines': 'List[str]', 'other_lines': 'List[str]'}
- __module__ = 'git.objects.submodule.root'
- __slots__ = ()
Objects.Submodule.util
- class git.objects.submodule.util.SubmoduleConfigParser(*args: Any, **kwargs: Any)
Catches calls to
write()
, and updates the.gitmodules
blob in the index with the new data, if we have written into a stream.Otherwise it would add the local file to the index to make it correspond with the working tree. Additionally, the cache must be cleared.
Please note that no mutating method will work in bare mode.
- __abstractmethods__ = frozenset({})
- __init__(*args: Any, **kwargs: Any) None
Initialize a configuration reader to read the given file_or_files and to possibly allow changes to it by setting read_only False.
- Parameters:
file_or_files – A file path or file object, or a sequence of possibly more than one of them.
read_only – If
True
, the ConfigParser may only read the data, but not change it. IfFalse
, only a single file path or file object may be given. We will write back the changes when they happen, or when the ConfigParser is released. This will not happen if other configuration files have been included.merge_includes – If
True
, we will read files mentioned in[include]
sections and merge their contents into ours. This makes it impossible to write back an individual configuration file. Thus, if you want to modify a single configuration file, turn this off to leave the original dataset unaltered when reading it.repo – Reference to repository to use if
[includeIf]
sections are found in configuration files.
- __module__ = 'git.objects.submodule.util'
- flush_to_index() None
Flush changes in our configuration file to the index.
- set_submodule(submodule: Submodule) None
Set this instance’s submodule. It must be called before the first write operation begins.
- write() None
Write changes to our file, if there are changes at all.
- Raises:
IOError – If this is a read-only writer instance or if we could not obtain a file lock.
- git.objects.submodule.util.find_first_remote_branch(remotes: Sequence[Remote], branch_name: str) RemoteReference
Find the remote branch matching the name of the given branch or raise
InvalidGitRepositoryError
.
- git.objects.submodule.util.mkhead(repo: Repo, path: str | os.PathLike[str]) Head
- Returns:
New branch/head instance
- git.objects.submodule.util.sm_name(section: str) str
- Returns:
Name of the submodule as parsed from the section name
- git.objects.submodule.util.sm_section(name: str) str
- Returns:
Section title used in
.gitmodules
configuration file
Objects.Util
Utility functions for working with git objects.
- class git.objects.util.Actor(name: str | None, email: str | None)
Actors hold information about a person acting on the repository. They can be committers and authors or anything with a name and an email as mentioned in the git log entries.
- __eq__(other: Any) bool
Return self==value.
- __hash__() int
Return hash(self).
- __init__(name: str | None, email: str | None) None
- __module__ = 'git.util'
- __ne__(other: Any) bool
Return self!=value.
- __repr__() str
Return repr(self).
- __slots__ = ('name', 'email')
- __str__() str
Return str(self).
- classmethod author(config_reader: None | GitConfigParser | SectionConstraint = None) Actor
Same as
committer()
, but defines the main author. It may be specified in the environment, but defaults to the committer.
- classmethod committer(config_reader: None | GitConfigParser | SectionConstraint = None) Actor
- Returns:
Actor
instance corresponding to the configured committer. It behaves similar to the git implementation, such that the environment will override configuration values of config_reader. If no value is set at all, it will be generated.- Parameters:
config_reader – ConfigReader to use to retrieve the values from in case they are not set in the environment.
- conf_email = 'email'
- conf_name = 'name'
- email
- env_author_email = 'GIT_AUTHOR_EMAIL'
- env_author_name = 'GIT_AUTHOR_NAME'
- env_committer_email = 'GIT_COMMITTER_EMAIL'
- env_committer_name = 'GIT_COMMITTER_NAME'
- name
- name_email_regex = re.compile('(.*) <(.*?)>')
- name_only_regex = re.compile('<(.*)>')
- class git.objects.util.ProcessStreamAdapter(process: Popen, stream_name: str)
Class wiring all calls to the contained Process instance.
Use this type to hide the underlying process to provide access only to a specified stream. The process is usually wrapped into an
AutoInterrupt
class to kill it if the instance goes out of scope.- __getattr__(attr: str) Any
- __init__(process: Popen, stream_name: str) None
- __module__ = 'git.objects.util'
- __slots__ = ('_proc', '_stream')
- class git.objects.util.Traversable
Simple interface to perform depth-first or breadth-first traversals in one direction.
Subclasses only need to implement one function.
Instances of the subclass must be hashable.
Defined subclasses:
- __abstractmethods__ = frozenset({'_get_intermediate_items', 'list_traverse', 'traverse'})
- __annotations__ = {}
- __module__ = 'git.objects.util'
- __slots__ = ()
- abstract list_traverse(*args: Any, **kwargs: Any) Any
Traverse self and collect all items found.
Calling this directly on the abstract base class, including via a
super()
proxy, is deprecated. Only overridden implementations should be called.
- abstract traverse(*args: Any, **kwargs: Any) Any
Iterator yielding items found when traversing self.
Calling this directly on the abstract base class, including via a
super()
proxy, is deprecated. Only overridden implementations should be called.
- git.objects.util.altz_to_utctz_str(altz: float) str
Convert a timezone offset west of UTC in seconds into a Git timezone offset string.
- Parameters:
altz – Timezone offset in seconds west of UTC.
- git.objects.util.get_object_type_by_name(object_type_name: bytes) Type[Commit] | Type[TagObject] | Type[Tree] | Type[Blob]
Retrieve the Python class GitPython uses to represent a kind of Git object.
- Returns:
A type suitable to handle the given as object_type_name. This type can be called create new instances.
- Parameters:
object_type_name – Member of
Object.TYPES
.- Raises:
ValueError – If object_type_name is unknown.
- git.objects.util.parse_actor_and_date(line: str) Tuple[Actor, int, int]
Parse out the actor (author or committer) info from a line like:
author Tom Preston-Werner <tom@mojombo.com> 1191999972 -0700
- Returns:
[Actor, int_seconds_since_epoch, int_timezone_offset]
- git.objects.util.parse_date(string_date: str | datetime) Tuple[int, int]
Parse the given date as one of the following:
Aware datetime instance
Git internal format: timestamp offset
RFC 2822:
Thu, 07 Apr 2005 22:13:13 +0200
ISO 8601:
2005-04-07T22:13:13
- TheT
can be a space as well.
- Returns:
Tuple(int(timestamp_UTC), int(offset)), both in seconds since epoch
- Raises:
ValueError – If the format could not be understood.
- Note:
Date can also be
YYYY.MM.DD
,MM/DD/YYYY
andDD.MM.YYYY
.
- class git.objects.util.tzoffset(secs_west_of_utc: float, name: None | str = None)
- __dict__ = mappingproxy({'__module__': 'git.objects.util', '__init__': <function tzoffset.__init__>, '__reduce__': <function tzoffset.__reduce__>, 'utcoffset': <function tzoffset.utcoffset>, 'tzname': <function tzoffset.tzname>, 'dst': <function tzoffset.dst>, '__dict__': <attribute '__dict__' of 'tzoffset' objects>, '__weakref__': <attribute '__weakref__' of 'tzoffset' objects>, '__doc__': None, '__annotations__': {}})
- __init__(secs_west_of_utc: float, name: None | str = None) None
- __module__ = 'git.objects.util'
- __weakref__
list of weak references to the object
- dst(dt: datetime | None) timedelta
datetime -> DST offset as timedelta positive east of UTC.
- tzname(dt: datetime | None) str
datetime -> string name of time zone.
- utcoffset(dt: datetime | None) timedelta
datetime -> timedelta showing offset from UTC, negative values indicating West of UTC
- git.objects.util.utctz_to_altz(utctz: str) int
Convert a git timezone offset into a timezone offset west of UTC in seconds (compatible with
time.altzone
).- Parameters:
utctz – git utc timezone string, e.g. +0200
- git.objects.util.verify_utctz(offset: str) str
- Raises:
ValueError – If offset is incorrect.
- Returns:
offset
Index.Base
Module containing IndexFile
, an Index implementation facilitating all kinds
of index manipulations such as querying and merging.
- exception git.index.base.CheckoutError(message: str, failed_files: Sequence[str | os.PathLike[str]], valid_files: Sequence[str | os.PathLike[str]], failed_reasons: List[str])
Thrown if a file could not be checked out from the index as it contained changes.
The
failed_files
attribute contains a list of relative paths that failed to be checked out as they contained changes that did not exist in the index.The
failed_reasons
attribute contains a string informing about the actual cause of the issue.The
valid_files
attribute contains a list of relative paths to files that were checked out successfully and hence match the version stored in the index.- __init__(message: str, failed_files: Sequence[str | os.PathLike[str]], valid_files: Sequence[str | os.PathLike[str]], failed_reasons: List[str]) None
- __module__ = 'git.exc'
- __str__() str
Return str(self).
- class git.index.base.IndexFile(repo: Repo, file_path: str | os.PathLike[str] | None = None)
An Index that can be manipulated using a native implementation in order to save git command function calls wherever possible.
This provides custom merging facilities allowing to merge without actually changing your index or your working tree. This way you can perform your own test merges based on the index only without having to deal with the working copy. This is useful in case of partial working trees.
Entries:
The index contains an entries dict whose keys are tuples of type
IndexEntry
to facilitate access.You may read the entries dict or manipulate it using IndexEntry instance, i.e.:
index.entries[index.entry_key(index_entry_instance)] = index_entry_instance
Make sure you use
index.write()
once you are done manipulating the index directly before operating on it using the git command.- S_IFGITLINK = 57344
Flags for a submodule.
- __abstractmethods__ = frozenset({})
- __annotations__ = {'_file_path': 'PathLike', 'repo': "'Repo'"}
- __init__(repo: Repo, file_path: str | os.PathLike[str] | None = None) None
Initialize this Index instance, optionally from the given file_path.
If no file_path is given, we will be created from the current index file.
If a stream is not given, the stream will be initialized from the current repository’s index on demand.
- __module__ = 'git.index.base'
- __slots__ = ('repo', 'version', 'entries', '_extension_data', '_file_path')
- add(items: str | ~os.PathLike[str] | ~typing.Sequence[str | ~os.PathLike[str] | ~git.objects.blob.Blob | ~git.index.typ.BaseIndexEntry | ~git.objects.submodule.base.Submodule], force: bool = True, fprogress: ~typing.Callable = <function IndexFile.<lambda>>, path_rewriter: ~typing.Callable[[...], str | ~os.PathLike[str]] | None = None, write: bool = True, write_extension_data: bool = False) List[BaseIndexEntry]
Add files from the working tree, specific blobs, or
BaseIndexEntry
s to the index.- Parameters:
items –
Multiple types of items are supported, types can be mixed within one call. Different types imply a different handling. File paths may generally be relative or absolute.
path string
Strings denote a relative or absolute path into the repository pointing to an existing file, e.g.,
CHANGES
, lib/myfile.ext`,/home/gitrepo/lib/myfile.ext
.Absolute paths must start with working tree directory of this index’s repository to be considered valid. For example, if it was initialized with a non-normalized path, like
/root/repo/../repo
, absolute paths to be added must start with/root/repo/../repo
.Paths provided like this must exist. When added, they will be written into the object database.
PathStrings may contain globs, such as
lib/__init__*
. Or they can be directories likelib
, which will add all the files within the directory and subdirectories.This equals a straight git-add(1).
They are added at stage 0.
:class:~`git.objects.blob.Blob` or
Submodule
objectBlobs are added as they are assuming a valid mode is set.
The file they refer to may or may not exist in the file system, but must be a path relative to our repository.
If their sha is null (40*0), their path must exist in the file system relative to the git repository as an object will be created from the data at the path.
The handling now very much equals the way string paths are processed, except that the mode you have set will be kept. This allows you to create symlinks by settings the mode respectively and writing the target of the symlink directly into the file. This equals a default Linux symlink which is not dereferenced automatically, except that it can be created on filesystems not supporting it as well.
Please note that globs or directories are not allowed in
Blob
objects.They are added at stage 0.
BaseIndexEntry
or typeHandling equals the one of :class:~`git.objects.blob.Blob` objects, but the stage may be explicitly set. Please note that Index Entries require binary sha’s.
force – CURRENTLY INEFFECTIVE If
True
, otherwise ignored or excluded files will be added anyway. As opposed to the git-add(1) command, we enable this flag by default as the API user usually wants the item to be added even though they might be excluded.fprogress –
Function with signature
f(path, done=False, item=item)
called for each path to be added, one time once it is about to be added wheredone=False
and once after it was added wheredone=True
.item
is set to the actual item we handle, either a path or aBaseIndexEntry
.Please note that the processed path is not guaranteed to be present in the index already as the index is currently being processed.
path_rewriter – Function, with signature
(string) func(BaseIndexEntry)
, returning a path for each passed entry which is the path to be actually recorded for the object created fromentry.path
. This allows you to write an index which is not identical to the layout of the actual files on your hard-disk. If notNone
and items contain plain paths, these paths will be converted to Entries beforehand and passed to the path_rewriter. Please note thatentry.path
is relative to the git repository.write – If
True
, the index will be written once it was altered. Otherwise the changes only exist in memory and are not available to git commands.write_extension_data –
If
True
, extension data will be written back to the index. This can lead to issues in case it is containing the ‘TREE’ extension, which will cause the git-commit(1) command to write an old tree, instead of a new one representing the now changed index.This doesn’t matter if you use
IndexFile.commit()
, which ignores the ‘TREE’ extension altogether. You should set it toTrue
if you intend to useIndexFile.commit()
exclusively while maintaining support for third-party extensions. Besides that, you can usually safely ignore the built-in extensions when using GitPython on repositories that are not handled manually at all.All current built-in extensions are listed here: https://git-scm.com/docs/index-format
- Returns:
List of
BaseIndexEntry
s representing the entries just actually added.- Raises:
OSError – If a supplied path did not exist. Please note that
BaseIndexEntry
objects that do not have a null sha will be added even if their paths do not exist.
- checkout(paths: None | ~typing.Iterable[str | ~os.PathLike[str]] = None, force: bool = False, fprogress: ~typing.Callable = <function IndexFile.<lambda>>, **kwargs: ~typing.Any) None | Iterator[str | PathLike[str]] | Sequence[str | PathLike[str]]
Check out the given paths or all files from the version known to the index into the working tree.
- Note:
Be sure you have written pending changes using the
write()
method in case you have altered the entries dictionary directly.- Parameters:
paths – If
None
, all paths in the index will be checked out. Otherwise an iterable of relative or absolute paths or a single path pointing to files or directories in the index is expected.force – If
True
, existing files will be overwritten even if they contain local modifications. IfFalse
, these will trigger aCheckoutError
.fprogress –
See
IndexFile.add()
for signature and explanation.The provided progress information will contain
None
as path and item if no explicit paths are given. Otherwise progress information will be send prior and after a file has been checked out.kwargs – Additional arguments to be passed to git-checkout-index(1).
- Returns:
Iterable yielding paths to files which have been checked out and are guaranteed to match the version stored in the index.
- Raises:
If at least one file failed to be checked out. This is a summary, hence it will checkout as many files as it can anyway.
If one of files or directories do not exist in the index (as opposed to the original git command, which ignores them).
git.exc.GitCommandError – If error lines could not be parsed - this truly is an exceptional state.
- Note:
The checkout is limited to checking out the files in the index. Files which are not in the index anymore and exist in the working tree will not be deleted. This behaviour is fundamentally different to
head.checkout
, i.e. if you want git-checkout(1)-like behaviour, usehead.checkout
instead ofindex.checkout
.
- commit(message: str, parent_commits: List[Commit] | None = None, head: bool = True, author: None | Actor = None, committer: None | Actor = None, author_date: datetime | str | None = None, commit_date: datetime | str | None = None, skip_hooks: bool = False) Commit
Commit the current default index file, creating a
Commit
object.For more information on the arguments, see
Commit.create_from_tree
.
- diff(other: ~typing.Literal[<DiffConstants.INDEX: 2>] | ~git.objects.tree.Tree | ~git.objects.commit.Commit | str | None = DiffConstants.INDEX, paths: str | ~os.PathLike[str] | ~typing.List[str | ~os.PathLike[str]] | ~typing.Tuple[str | ~os.PathLike[str], ...] | None = None, create_patch: bool = False, **kwargs: ~typing.Any) DiffIndex[Diff]
Diff this index against the working copy or a
Tree
orCommit
object.For documentation of the parameters and return values, see
Diffable.diff
.- Note:
Will only work with indices that represent the default git index as they have not been initialized with a stream.
- entries
- classmethod entry_key(*entry: BaseIndexEntry | str | PathLike[str] | int) Tuple[str | PathLike[str], int]
- classmethod from_tree(repo: Repo, *treeish: Tree | Commit | str | bytes, **kwargs: Any) IndexFile
Merge the given treeish revisions into a new index which is returned. The original index will remain unaltered.
- Parameters:
repo – The repository treeish are located in.
treeish –
One, two or three
Tree
objects,Commit
s or 40 byte hexshas.The result changes according to the amount of trees:
If 1 Tree is given, it will just be read into a new index.
If 2 Trees are given, they will be merged into a new index using a two way merge algorithm. Tree 1 is the ‘current’ tree, tree 2 is the ‘other’ one. It behaves like a fast-forward.
If 3 Trees are given, a 3-way merge will be performed with the first tree being the common ancestor of tree 2 and tree 3. Tree 2 is the ‘current’ tree, tree 3 is the ‘other’ one.
kwargs – Additional arguments passed to git-read-tree(1).
- Returns:
New
IndexFile
instance. It will point to a temporary index location which does not exist anymore. If you intend to write such a merged Index, supply an alternatefile_path
to itswrite()
method.- Note:
In the three-way merge case,
--aggressive
will be specified to automatically resolve more cases in a commonly correct manner. Specifytrivial=True
as a keyword argument to override that.As the underlying git-read-tree(1) command takes into account the current index, it will be temporarily moved out of the way to prevent any unexpected interference.
- iter_blobs(predicate: ~typing.Callable[[~typing.Tuple[int, ~git.objects.blob.Blob]], bool] = <function IndexFile.<lambda>>) Iterator[Tuple[int, Blob]]
- Returns:
Iterator yielding tuples of
Blob
objects and stages, tuple(stage, Blob).- Parameters:
predicate – Function(t) returning
True
if tuple(stage, Blob) should be yielded by the iterator. A default filter, the ~git.index.typ.BlobFilter, allows you to yield blobs only if they match a given list of paths.
- merge_tree(rhs: Tree | Commit | str | bytes, base: None | Tree | Commit | str | bytes = None) IndexFile
Merge the given rhs treeish into the current index, possibly taking a common base treeish into account.
As opposed to the
from_tree()
method, this allows you to use an already existing tree as the left side of the merge.- Parameters:
rhs – Treeish reference pointing to the ‘other’ side of the merge.
base – Optional treeish reference pointing to the common base of rhs and this index which equals lhs.
- Returns:
self (containing the merge and possibly unmerged entries in case of conflicts)
- Raises:
git.exc.GitCommandError – If there is a merge conflict. The error will be raised at the first conflicting path. If you want to have proper merge resolution to be done by yourself, you have to commit the changed index (or make a valid tree from it) and retry with a three-way
index.from_tree
call.
- move(items: str | PathLike[str] | Sequence[str | PathLike[str] | Blob | BaseIndexEntry | Submodule], skip_errors: bool = False, **kwargs: Any) List[Tuple[str, str]]
Rename/move the items, whereas the last item is considered the destination of the move operation.
If the destination is a file, the first item (of two) must be a file as well.
If the destination is a directory, it may be preceded by one or more directories or files.
The working tree will be affected in non-bare repositories.
- Parameters:
- Returns:
List(tuple(source_path_string, destination_path_string), …)
A list of pairs, containing the source file moved as well as its actual destination. Relative to the repository root.
- Raises:
ValueError – If only one item was given.
git.exc.GitCommandError – If git could not handle your request.
- classmethod new(repo: Repo, *tree_sha: str | Tree) IndexFile
Merge the given treeish revisions into a new index which is returned.
This method behaves like
git-read-tree --aggressive
when doing the merge.
- property path: str | PathLike[str]
- Returns:
Path to the index file we are representing
- remove(items: str | PathLike[str] | Sequence[str | PathLike[str] | Blob | BaseIndexEntry | Submodule], working_tree: bool = False, **kwargs: Any) List[str]
Remove the given items from the index and optionally from the working tree as well.
- Parameters:
items –
Multiple types of items are supported which may be be freely mixed.
path string
Remove the given path at all stages. If it is a directory, you must specify the
r=True
keyword argument to remove all file entries below it. If absolute paths are given, they will be converted to a path relative to the git repository directory containing the working treeThe path string may include globs, such as
*.c
.:class:~`git.objects.blob.Blob` object
Only the path portion is used in this case.
BaseIndexEntry
or compatible typeThe only relevant information here is the path. The stage is ignored.
working_tree – If
True
, the entry will also be removed from the working tree, physically removing the respective file. This may fail if there are uncommitted changes in it.kwargs – Additional keyword arguments to be passed to git-rm(1), such as
r
to allow recursive removal.
- Returns:
List(path_string, …) list of repository relative paths that have been removed effectively.
This is interesting to know in case you have provided a directory or globs. Paths are relative to the repository.
- reset(commit: Commit | Reference | str = 'HEAD', working_tree: bool = False, paths: None | Iterable[str | os.PathLike[str]] = None, head: bool = False, **kwargs: Any) IndexFile
Reset the index to reflect the tree at the given commit. This will not adjust our HEAD reference by default, as opposed to
HEAD.reset
.- Parameters:
commit –
Revision,
Reference
orCommit
specifying the commit we should represent.If you want to specify a tree only, use
IndexFile.from_tree()
and overwrite the default index.working_tree – If
True
, the files in the working tree will reflect the changed index. IfFalse
, the working tree will not be touched. Please note that changes to the working copy will be discarded without warning!head – If
True
, the head will be set to the given commit. This isFalse
by default, but ifTrue
, this method behaves likeHEAD.reset
.paths – If given as an iterable of absolute or repository-relative paths, only these will be reset to their state at the given commit-ish. The paths need to exist at the commit, otherwise an exception will be raised.
kwargs – Additional keyword arguments passed to git-reset(1).
- Note:
IndexFile.reset()
, as opposed toHEAD.reset
, will not delete any files in order to maintain a consistent working tree. Instead, it will just check out the files according to their state in the index. If you want git-reset(1)-like behaviour, useHEAD.reset
instead.- Returns:
self
- resolve_blobs(iter_blobs: Iterator[Blob]) IndexFile
Resolve the blobs given in blob iterator.
This will effectively remove the index entries of the respective path at all non-null stages and add the given blob as new stage null blob.
For each path there may only be one blob, otherwise a
ValueError
will be raised claiming the path is already at stage 0.- Raises:
ValueError – If one of the blobs already existed at stage 0.
- Returns:
self
- Note:
You will have to write the index manually once you are done, i.e.
index.resolve_blobs(blobs).write()
.
- unmerged_blobs() Dict[str | PathLike[str], List[Tuple[int, Blob]]]
- Returns:
Dict(path : list(tuple(stage, Blob, …))), being a dictionary associating a path in the index with a list containing sorted stage/blob pairs.
- Note:
Blobs that have been removed in one side simply do not exist in the given stage. That is, a file removed on the ‘other’ branch whose entries are at stage 3 will not have a stage 3 entry.
- update() IndexFile
Reread the contents of our index file, discarding all cached information we might have.
- Note:
This is a possibly dangerous operations as it will discard your changes to
index.entries
.- Returns:
self
- version
- write(file_path: None | str | PathLike[str] = None, ignore_extension_data: bool = False) None
Write the current state to our file path or to the given one.
- Parameters:
file_path – If
None
, we will write to our stored file path from which we have been initialized. Otherwise we write to the given file path. Please note that this will change the file_path of this index to the one you gave.ignore_extension_data – If
True
, the TREE type extension data read in the index will not be written to disk. NOTE that no extension data is actually written. Use this if you have altered the index and would like to use git-write-tree(1) afterwards to create a tree representing your written changes. If this data is present in the written index, git-write-tree(1) will instead write the stored/cached tree. Alternatively, usewrite_tree()
to handle this case automatically.
- write_tree() Tree
Write this index to a corresponding
Tree
object into the repository’s object database and return it.- Returns:
Tree
object representing this index.- Note:
The tree will be written even if one or more objects the tree refers to does not yet exist in the object database. This could happen if you added entries to the index directly.
- Raises:
ValueError – If there are no entries in the cache.
- git.index.base.StageType
alias of
int
Index.Functions
Standalone functions to accompany the index implementation and make it more versatile.
- git.index.fun.S_IFGITLINK = 57344
Flags for a submodule.
- git.index.fun.entry_key(*entry: BaseIndexEntry | str | PathLike[str] | int) Tuple[str | PathLike[str], int]
- Returns:
Key suitable to be used for the
index.entries
dictionary.- Parameters:
entry – One instance of type BaseIndexEntry or the path and the stage.
- git.index.fun.hook_path(name: str, git_dir: str | PathLike[str]) str
- Returns:
path to the given named hook in the given git repository directory
- git.index.fun.read_cache(stream: IO[bytes]) Tuple[int, Dict[Tuple[str | PathLike[str], int], IndexEntry], bytes, bytes]
Read a cache file from the given stream.
- Returns:
tuple(version, entries_dict, extension_data, content_sha)
version is the integer version number.
entries_dict is a dictionary which maps IndexEntry instances to a path at a stage.
extension_data is
""
or 4 bytes of type + 4 bytes of size + size bytes.content_sha is a 20 byte sha on all cache file contents.
- git.index.fun.run_commit_hook(name: str, index: IndexFile, *args: str) None
Run the commit hook of the given name. Silently ignore hooks that do not exist.
- Parameters:
name – Name of hook, like
pre-commit
.index –
IndexFile
instance.args – Arguments passed to hook file.
- Raises:
- git.index.fun.stat_mode_to_index_mode(mode: int) int
Convert the given mode from a stat call to the corresponding index mode and return it.
- git.index.fun.write_cache(entries: ~typing.Sequence[~git.index.typ.BaseIndexEntry | ~git.index.typ.IndexEntry], stream: ~typing.IO[bytes], extension_data: None | bytes = None, ShaStreamCls: ~typing.Type[~git.util.IndexFileSHA1Writer] = <class 'git.util.IndexFileSHA1Writer'>) None
Write the cache represented by entries to a stream.
- Parameters:
entries – Sorted list of entries.
stream – Stream to wrap into the AdapterStreamCls - it is used for final output.
ShaStreamCls – Type to use when writing to the stream. It produces a sha while writing to it, before the data is passed on to the wrapped stream.
extension_data – Any kind of data to write as a trailer, it must begin a 4 byte identifier, followed by its size (4 bytes).
- git.index.fun.write_tree_from_cache(entries: List[IndexEntry], odb: GitCmdObjectDB, sl: slice, si: int = 0) Tuple[bytes, List[TreeCacheTup]]
Create a tree from the given sorted list of entries and put the respective trees into the given object database.
- Parameters:
entries – Sorted list of
IndexEntry
s.odb – Object database to store the trees in.
si – Start index at which we should start creating subtrees.
sl – Slice indicating the range we should process on the entries list.
- Returns:
tuple(binsha, list(tree_entry, …))
A tuple of a sha and a list of tree entries being a tuple of hexsha, mode, name.
Index.Types
Additional types used by the index.
- class git.index.typ.BaseIndexEntry(inp_tuple: Tuple[int, bytes, int, str | os.PathLike[str]] | Tuple[int, bytes, int, str | os.PathLike[str], bytes, bytes, int, int, int, int, int])
Small brother of an index entry which can be created to describe changes done to the index in which case plenty of additional information is not required.
As the first 4 data members match exactly to the
IndexEntry
type, methods expecting aBaseIndexEntry
can also handle fullIndexEntry
s even if they use numeric indices for performance reasons.- __annotations__ = {}
- __dict__ = mappingproxy({'__module__': 'git.index.typ', '__doc__': 'Small brother of an index entry which can be created to describe changes\n done to the index in which case plenty of additional information is not required.\n\n As the first 4 data members match exactly to the :class:`IndexEntry` type, methods\n expecting a :class:`BaseIndexEntry` can also handle full :class:`IndexEntry`\\s even\n if they use numeric indices for performance reasons.\n ', '__new__': <staticmethod(<function BaseIndexEntry.__new__>)>, '__str__': <function BaseIndexEntry.__str__>, '__repr__': <function BaseIndexEntry.__repr__>, 'hexsha': <property object>, 'stage': <property object>, 'from_blob': <classmethod(<function BaseIndexEntry.from_blob>)>, 'to_blob': <function BaseIndexEntry.to_blob>, '__dict__': <attribute '__dict__' of 'BaseIndexEntry' objects>, '__annotations__': {'mode': 'int', 'binsha': 'bytes', 'flags': 'int', 'path': 'PathLike', 'ctime_bytes': 'bytes', 'mtime_bytes': 'bytes', 'dev': 'int', 'inode': 'int', 'uid': 'int', 'gid': 'int', 'size': 'int'}})
- __module__ = 'git.index.typ'
- static __new__(cls, inp_tuple: Tuple[int, bytes, int, str | os.PathLike[str]] | Tuple[int, bytes, int, str | os.PathLike[str], bytes, bytes, int, int, int, int, int]) BaseIndexEntry
Override
__new__
to allow construction from a tuple for backwards compatibility.
- __repr__() str
Return a nicely formatted representation string
- __str__() str
Return str(self).
- classmethod from_blob(blob: Blob, stage: int = 0) BaseIndexEntry
- Returns:
Fully equipped BaseIndexEntry at the given stage
- property hexsha: str
hex version of our sha
- property stage: int
Stage of the entry, either:
0 = default stage
1 = stage before a merge or common ancestor entry in case of a 3 way merge
2 = stage of entries from the ‘left’ side of the merge
3 = stage of entries from the ‘right’ side of the merge
- Note:
For more information, see git-read-tree(1).
- class git.index.typ.BlobFilter(paths: Sequence[str | os.PathLike[str]])
Predicate to be used by
IndexFile.iter_blobs
allowing to filter only return blobs which match the given list of directories or files.The given paths are given relative to the repository.
- __init__(paths: Sequence[str | os.PathLike[str]]) None
- Parameters:
paths – Tuple or list of paths which are either pointing to directories or to files relative to the current repository.
- __module__ = 'git.index.typ'
- __slots__ = ('paths',)
- paths
- class git.index.typ.IndexEntry(inp_tuple: Tuple[int, bytes, int, str | os.PathLike[str]] | Tuple[int, bytes, int, str | os.PathLike[str], bytes, bytes, int, int, int, int, int])
Allows convenient access to index entry data as defined in
BaseIndexEntry
without completely unpacking it.Attributes usually accessed often are cached in the tuple whereas others are unpacked on demand.
See the properties for a mapping between names and tuple indices.
- __annotations__ = {}
- __module__ = 'git.index.typ'
- property ctime: Tuple[int, int]
- Returns:
Tuple(int_time_seconds_since_epoch, int_nano_seconds) of the file’s creation time
- classmethod from_base(base: BaseIndexEntry) IndexEntry
- Returns:
Minimal entry as created from the given
BaseIndexEntry
instance. Missing values will be set to null-like values.- Parameters:
base – Instance of type
BaseIndexEntry
.
- classmethod from_blob(blob: Blob, stage: int = 0) IndexEntry
- Returns:
Minimal entry resembling the given blob object
- git.index.typ.StageType
alias of
int
Index.Util
Index utilities.
- class git.index.util.TemporaryFileSwap(file_path: str | PathLike[str])
Utility class moving a file to a temporary location within the same directory and moving it back on to where on object deletion.
- __enter__() TemporaryFileSwap
- __exit__(exc_type: Type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None) Literal[False]
- __init__(file_path: str | PathLike[str]) None
- __module__ = 'git.index.util'
- __slots__ = ('file_path', 'tmp_file_path')
- file_path
- tmp_file_path
- git.index.util.default_index(func: Callable[[...], _T]) Callable[[...], _T]
Decorator ensuring the wrapped method may only run if we are the default repository index.
This is as we rely on git commands that operate on that index only.
- git.index.util.git_working_dir(func: Callable[[...], _T]) Callable[[...], _T]
Decorator which changes the current working dir to the one of the git repository in order to ensure relative paths are handled correctly.
- git.index.util.post_clear_cache(func: Callable[[...], _T]) Callable[[...], _T]
Decorator for functions that alter the index using the git command.
When a git command alters the index, this invalidates our possibly existing entries dictionary, which is why it must be deleted to allow it to be lazily reread later.
GitCmd
- class git.cmd.Git(working_dir: None | str | PathLike[str] = None)
The Git class manages communication with the Git binary.
It provides a convenient interface to calling the Git binary, such as in:
g = Git( git_dir ) g.init() # calls 'git init' program rval = g.ls_files() # calls 'git ls-files' program
Debugging:
Set the
GIT_PYTHON_TRACE
environment variable to print each invocation of the command to stdout.Set its value to
full
to see details about the returned values.
- class AutoInterrupt(proc: None | Popen, args: Any)
Process wrapper that terminates the wrapped process on finalization.
This kills/interrupts the stored process instance once this instance goes out of scope. It is used to prevent processes piling up in case iterators stop reading.
All attributes are wired through to the contained process object.
The wait method is overridden to perform automatic status code checking and possibly raise.
- __annotations__ = {'_status_code_if_terminate': 'int'}
- __del__() None
- __getattr__(attr: str) Any
- __init__(proc: None | Popen, args: Any) None
- __module__ = 'git.cmd'
- __slots__ = ('proc', 'args', 'status')
- args
- proc
- status: int | None
- wait(stderr: None | str | bytes = b'') int
Wait for the process and return its status code.
- Parameters:
stderr – Previously read value of stderr, in case stderr is already closed.
- Warn:
May deadlock if output or error pipes are used and not handled separately.
- Raises:
git.exc.GitCommandError – If the return status is not 0.
- class CatFileContentStream(size: int, stream: IO[bytes])
Object representing a sized read-only stream returning the contents of an object.
This behaves like a stream, but counts the data read and simulates an empty stream once our sized content region is empty.
If not all data are read to the end of the object’s lifetime, we read the rest to ensure the underlying stream continues to work.
- __del__() None
- __init__(size: int, stream: IO[bytes]) None
- __iter__() CatFileContentStream
- __module__ = 'git.cmd'
- __next__() bytes
- __slots__ = ('_stream', '_nbr', '_size')
- next() bytes
- read(size: int = -1) bytes
- readline(size: int = -1) bytes
- readlines(size: int = -1) List[bytes]
- GIT_PYTHON_GIT_EXECUTABLE = 'git'
Provide the full path to the git executable. Otherwise it assumes git is in the executable search path.
- Note:
The git executable is actually found during the refresh step in the top level
__init__
. It can also be changed by explicitly callinggit.refresh()
.
- GIT_PYTHON_TRACE = False
Enables debugging of GitPython’s git commands.
- USE_SHELL: bool = False
Deprecated. If set to
True
, a shell will be used when executing git commands.Code that uses
USE_SHELL = True
or that passesshell=True
to any GitPython functions should be updated to use the default value ofFalse
instead.True
is unsafe unless the effect of syntax treated specially by the shell is fully considered and accounted for, which is not possible under most circumstances. As detailed below, it is also no longer needed, even where it had been in the past.It is in many if not most cases a command injection vulnerability for an application to set
USE_SHELL
toTrue
. Any attacker who can cause a specially crafted fragment of text to make its way into any part of any argument to any git command (including paths, branch names, etc.) can cause the shell to read and write arbitrary files and execute arbitrary commands. Innocent input may also accidentally contain special shell syntax, leading to inadvertent malfunctions.In addition, how a value of
True
interacts with some aspects of GitPython’s operation is not precisely specified and may change without warning, even before GitPython 4.0.0 whenUSE_SHELL
may be removed. This includes:Whether or how GitPython automatically customizes the shell environment.
Whether, outside of Windows (where
subprocess.Popen
supports lists of separate arguments even whenshell=True
), this can be used with any GitPython functionality other than direct calls to theexecute()
method.Whether any GitPython feature that runs git commands ever attempts to partially sanitize data a shell may treat specially. Currently this is not done.
Prior to GitPython 2.0.8, this had a narrow purpose in suppressing console windows in graphical Windows applications. In 2.0.8 and higher, it provides no benefit, as GitPython solves that problem more robustly and safely by using the
CREATE_NO_WINDOW
process creation flag on Windows.Because Windows path search differs subtly based on whether a shell is used, in rare cases changing this from
True
toFalse
may keep an unusual git “executable”, such as a batch file, from being found. To fix this, set the command name or full path in theGIT_PYTHON_GIT_EXECUTABLE
environment variable or pass the full path togit.refresh()
(or invoke the script using a.exe
shim).Further reading:
- __annotations__ = {'USE_SHELL': 'bool', '_environment': 'Dict[str, str]', '_git_options': 'Union[List[str], Tuple[str, ...]]', '_persistent_git_options': 'List[str]', '_version_info': 'Union[Tuple[int, ...], None]', '_version_info_token': 'object', 'cat_file_all': 'Union[None, TBD]', 'cat_file_header': 'Union[None, TBD]'}
- __call__(**kwargs: Any) Git
Specify command line options to the git executable for a subcommand call.
- Parameters:
kwargs – A dict of keyword arguments. These arguments are passed as in
_call_process()
, but will be passed to the git command rather than the subcommand.
Examples:
git(work_tree='/tmp').difftool()
- __getattr__(name: str) Any
A convenience method as it allows to call the command as if it was an object.
- Returns:
Callable object that will execute call
_call_process()
with your arguments.
- __getattribute__(name: str) Any
Return getattr(self, name).
- __getstate__() Dict[str, Any]
Helper for pickle.
- __init__(working_dir: None | str | PathLike[str] = None) None
Initialize this instance with:
- Parameters:
working_dir – Git directory we should work in. If
None
, we always work in the current directory as returned byos.getcwd()
. This is meant to be the working tree directory if available, or the.git
directory in case of bare repositories.
- __module__ = 'git.cmd'
- __setstate__(d: Dict[str, Any]) None
- __slots__ = ('_working_dir', 'cat_file_all', 'cat_file_header', '_version_info', '_version_info_token', '_git_options', '_persistent_git_options', '_environment')
- cat_file_all: None | Any
- cat_file_header: None | Any
- classmethod check_unsafe_options(options: List[str], unsafe_options: List[str]) None
Check for unsafe options.
Some options that are passed to
git <command>
can be used to execute arbitrary commands. These are blocked by default.
- classmethod check_unsafe_protocols(url: str) None
Check for unsafe protocols.
Apart from the usual protocols (http, git, ssh), Git allows “remote helpers” that have the form
<transport>::<address>
. One of these helpers (ext::
) can be used to invoke any arbitrary command.See:
- clear_cache() Git
Clear all kinds of internal caches to release resources.
Currently persistent commands will be interrupted.
- Returns:
self
- custom_environment(**kwargs: Any) Iterator[None]
A context manager around the above
update_environment()
method to restore the environment back to its previous state after operation.Examples:
with self.custom_environment(GIT_SSH='/bin/ssh_wrapper'): repo.remotes.origin.fetch()
- Parameters:
kwargs – See
update_environment()
.
- environment() Dict[str, str]
- execute(command: str | Sequence[Any], *, as_process: Literal[True]) AutoInterrupt
- execute(command: str | Sequence[Any], *, as_process: Literal[False] = False, stdout_as_string: Literal[True]) str | Tuple[int, str, str]
- execute(command: str | Sequence[Any], *, as_process: Literal[False] = False, stdout_as_string: Literal[False] = False) bytes | Tuple[int, bytes, str]
- execute(command: str | Sequence[Any], *, with_extended_output: Literal[False], as_process: Literal[False], stdout_as_string: Literal[True]) str
- execute(command: str | Sequence[Any], *, with_extended_output: Literal[False], as_process: Literal[False], stdout_as_string: Literal[False]) bytes
Handle executing the command, and consume and return the returned information (stdout).
- Parameters:
command – The command argument list to execute. It should be a sequence of program arguments, or a string. The program to execute is the first item in the args sequence or string.
istream – Standard input filehandle passed to
subprocess.Popen
.with_extended_output – Whether to return a (status, stdout, stderr) tuple.
with_exceptions – Whether to raise an exception when git returns a non-zero status.
as_process – Whether to return the created process instance directly from which streams can be read on demand. This will render with_extended_output and with_exceptions ineffective - the caller will have to deal with the details. It is important to note that the process will be placed into an
AutoInterrupt
wrapper that will interrupt the process once it goes out of scope. If you use the command in iterators, you should pass the whole process instance instead of a single stream.output_stream – If set to a file-like object, data produced by the git command will be copied to the given stream instead of being returned as a string. This feature only has any effect if as_process is
False
.stdout_as_string – If
False
, the command’s standard output will be bytes. Otherwise, it will be decoded into a string using the default encoding (usually UTF-8). The latter can fail, if the output contains binary data.kill_after_timeout –
Specifies a timeout in seconds for the git command, after which the process should be killed. This will have no effect if as_process is set to
True
. It is set toNone
by default and will let the process run until the timeout is explicitly specified. Uses of this feature should be carefully considered, due to the following limitations:This feature is not supported at all on Windows.
Effectiveness may vary by operating system.
ps --ppid
is used to enumerate child processes, which is available on most GNU/Linux systems but not most others.Deeper descendants do not receive signals, though they may sometimes terminate as a consequence of their parent processes being killed.
kill_after_timeout uses
SIGKILL
, which can have negative side effects on a repository. For example, stale locks in case of git-gc(1) could render the repository incapable of accepting changes until the lock is manually removed.
with_stdout – If
True
, defaultTrue
, we open stdout on the created process.universal_newlines – If
True
, pipes will be opened as text, and lines are split at all known line endings.shell –
Whether to invoke commands through a shell (see
Popen(..., shell=True)
). If this is notNone
, it overridesUSE_SHELL
.Passing
shell=True
to this or any other GitPython function should be avoided, as it is unsafe under most circumstances. This is because it is typically not feasible to fully consider and account for the effect of shell expansions, especially when passingshell=True
to other methods that forward it toGit.execute()
. Passingshell=True
is also no longer needed (nor useful) to work around any known operating system specific issues.env – A dictionary of environment variables to be passed to
subprocess.Popen
.max_chunk_size – Maximum number of bytes in one chunk of data passed to the output_stream in one invocation of its
write()
method. If the given number is not positive then the default value is used.strip_newline_in_stdout – Whether to strip the trailing
\n
of the command stdout.subprocess_kwargs – Keyword arguments to be passed to
subprocess.Popen
. Please note that some of the valid kwargs are already set by this method; the ones you specify may not be the same ones.
- Returns:
str(output), if extended_output is
False
(Default)tuple(int(status), str(stdout), str(stderr)), if extended_output is
True
If output_stream is
True
, the stdout value will be your output stream:output_stream, if extended_output is
False
tuple(int(status), output_stream, str(stderr)), if extended_output is
True
Note that git is executed with
LC_MESSAGES="C"
to ensure consistent output regardless of system language.- Raises:
- Note:
If you add additional keyword arguments to the signature of this method, you must update the
execute_kwargs
variable housed in this module.
- get_object_data(ref: str) Tuple[str, str, int, bytes]
Similar to
get_object_header()
, but returns object data as well.- Returns:
(hexsha, type_string, size_as_int, data_string)
- Note:
Not threadsafe.
- get_object_header(ref: str) Tuple[str, str, int]
Use this method to quickly examine the type and size of the object behind the given ref.
- Note:
The method will only suffer from the costs of command invocation once and reuses the command in subsequent calls.
- Returns:
(hexsha, type_string, size_as_int)
- git_exec_name = 'git'
Default git command that should work on Linux, Windows, and other systems.
- classmethod is_cygwin() bool
- classmethod polish_url(url: str, is_cygwin: Literal[False] = None) str
- classmethod polish_url(url: str, is_cygwin: None | bool = None) str
Remove any backslashes from URLs to be written in config files.
Windows might create config files containing paths with backslashes, but git stops liking them as it will escape the backslashes. Hence we undo the escaping just to be sure.
- re_unsafe_protocol = re.compile('(.+)::.+')
- classmethod refresh(path: None | str | PathLike[str] = None) bool
Update information about the git executable
Git
objects will use.Called by the
git.refresh()
function in the top level__init__
.- Parameters:
path – Optional path to the git executable. If not absolute, it is resolved immediately, relative to the current directory. (See note below.)
- Note:
The top-level
git.refresh()
should be preferred because it calls this method and may also update other state accordingly.- Note:
There are three different ways to specify the command that refreshing causes to be used for git:
Pass no path argument and do not set the
GIT_PYTHON_GIT_EXECUTABLE
environment variable. The command namegit
is used. It is looked up in a path search by the system, in each command run (roughly similar to how git is found when runninggit
commands manually). This is usually the desired behavior.Pass no path argument but set the
GIT_PYTHON_GIT_EXECUTABLE
environment variable. The command given as the value of that variable is used. This may be a simple command or an arbitrary path. It is looked up in each command run. SettingGIT_PYTHON_GIT_EXECUTABLE
togit
has the same effect as not setting it.Pass a path argument. This path, if not absolute, is immediately resolved, relative to the current directory. This resolution occurs at the time of the refresh. When git commands are run, they are run using that previously resolved path. If a path argument is passed, the
GIT_PYTHON_GIT_EXECUTABLE
environment variable is not consulted.
- Note:
Refreshing always sets the
Git.GIT_PYTHON_GIT_EXECUTABLE
class attribute, which can be read on theGit
class or any of its instances to check what command is used to run git. This attribute should not be confused with the relatedGIT_PYTHON_GIT_EXECUTABLE
environment variable. The class attribute is set no matter how refreshing is performed.
- set_persistent_git_options(**kwargs: Any) None
Specify command line options to the git executable for subsequent subcommand calls.
- Parameters:
kwargs – A dict of keyword arguments. These arguments are passed as in
_call_process()
, but will be passed to the git command rather than the subcommand.
- stream_object_data(ref: str) Tuple[str, str, int, CatFileContentStream]
Similar to
get_object_data()
, but returns the data as a stream.- Returns:
(hexsha, type_string, size_as_int, stream)
- Note:
This method is not threadsafe. You need one independent
Git
instance per thread to be safe!
- transform_kwarg(name: str, value: Any, split_single_char_options: bool) List[str]
- transform_kwargs(split_single_char_options: bool = True, **kwargs: Any) List[str]
Transform Python-style kwargs into git command line options.
- update_environment(**kwargs: Any) Dict[str, str | None]
Set environment variables for future git invocations. Return all changed values in a format that can be passed back into this function to revert the changes.
Examples:
old_env = self.update_environment(PWD='/tmp') self.update_environment(**old_env)
- Parameters:
kwargs – Environment variables to use for git processes.
- Returns:
Dict that maps environment variables to their old values
- property version_info: Tuple[int, ...]
- Returns:
Tuple with integers representing the major, minor and additional version numbers as parsed from git-version(1). Up to four fields are used.
This value is generated on demand and is cached.
- property working_dir: None | str | PathLike[str]
- Returns:
Git directory we are working on
- git.cmd.GitMeta
Alias of
Git
’s metaclass, whether it istype
or a custom metaclass.Whether the
Git
class has the defaulttype
as its metaclass or uses a custom metaclass is not documented and may change at any time. This statically checkable metaclass alias is equivalent at runtime totype(Git)
. This should almost never be used. Code that benefits from it is likely to be remain brittle even if it is used.In view of the
Git
class’s intended use andGit
objects’ dynamic callable attributes representing git subcommands, it rarely makes sense to inherit fromGit
at all. UsingGit
in multiple inheritance can be especially tricky to do correctly. Attempting uses ofGit
where its metaclass is relevant, such as when a sibling class has an unrelated metaclass and a shared lower bound metaclass might have to be introduced to solve a metaclass conflict, is not recommended.- Note:
The correct static type of the
Git
class itself, and any subclasses, isType[Git]
. (This can be written astype[Git]
in Python 3.9 later.)GitMeta
should never be used in any annotation whereType[Git]
is intended or otherwise possible to use. This alias is truly only for very rare and inherently precarious situations where it is necessary to deal with the metaclass explicitly.
Config
Parser for reading and writing configuration files.
- git.config.GitConfigParser
alias of
GitConfigParser
- class git.config.SectionConstraint(config: T_ConfigParser, section: str)
Constrains a ConfigParser to only option commands which are constrained to always use the section we have been initialized with.
It supports all ConfigParser methods that operate on an option.
- Note:
If used as a context manager, will release the wrapped ConfigParser.
- __annotations__ = {}
- __del__() None
- __enter__() SectionConstraint[T_ConfigParser]
- __exit__(exception_type: str, exception_value: str, traceback: str) None
- __getattr__(attr: str) Any
- __init__(config: T_ConfigParser, section: str) None
- __module__ = 'git.config'
- __orig_bases__ = (typing.Generic[~T_ConfigParser],)
- __parameters__ = (~T_ConfigParser,)
- __slots__ = ('_config', '_section_name')
- property config: T_ConfigParser
return: ConfigParser instance we constrain
- release() None
Equivalent to
GitConfigParser.release()
, which is called on our underlying parser instance.
Diff
- class git.diff.Diff(repo: Repo, a_rawpath: bytes | None, b_rawpath: bytes | None, a_blob_id: str | bytes | None, b_blob_id: str | bytes | None, a_mode: bytes | str | None, b_mode: bytes | str | None, new_file: bool, deleted_file: bool, copied_file: bool, raw_rename_from: bytes | None, raw_rename_to: bytes | None, diff: str | bytes | None, change_type: Literal['A', 'D', 'C', 'M', 'R', 'T', 'U'] | None, score: int | None)
A Diff contains diff information between two Trees.
It contains two sides a and b of the diff. Members are prefixed with “a” and “b” respectively to indicate that.
Diffs keep information about the changed blob objects, the file mode, renames, deletions and new files.
There are a few cases where
None
has to be expected as member variable value:New File:
a_mode is None a_blob is None a_path is None
Deleted File:
b_mode is None b_blob is None b_path is None
Working Tree Blobs:
When comparing to working trees, the working tree blob will have a null hexsha as a corresponding object does not yet exist. The mode will be null as well. The path will be available, though.
If it is listed in a diff, the working tree version of the file must differ from the version in the index or tree, and hence has been modified.
- NULL_BIN_SHA = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
- NULL_HEX_SHA = '0000000000000000000000000000000000000000'
- __eq__(other: object) bool
Return self==value.
- __hash__() int
Return hash(self).
- __init__(repo: Repo, a_rawpath: bytes | None, b_rawpath: bytes | None, a_blob_id: str | bytes | None, b_blob_id: str | bytes | None, a_mode: bytes | str | None, b_mode: bytes | str | None, new_file: bool, deleted_file: bool, copied_file: bool, raw_rename_from: bytes | None, raw_rename_to: bytes | None, diff: str | bytes | None, change_type: Literal['A', 'D', 'C', 'M', 'R', 'T', 'U'] | None, score: int | None) None
- __module__ = 'git.diff'
- __ne__(other: object) bool
Return self!=value.
- __slots__ = ('a_blob', 'b_blob', 'a_mode', 'b_mode', 'a_rawpath', 'b_rawpath', 'new_file', 'deleted_file', 'copied_file', 'raw_rename_from', 'raw_rename_to', 'diff', 'change_type', 'score')
- __str__() str
Return str(self).
- a_blob: 'IndexObject' | None
- a_mode
- property a_path: str | None
- a_rawpath
- b_blob: 'IndexObject' | None
- b_mode
- property b_path: str | None
- b_rawpath
- change_type: Lit_change_type | None
- copied_file: bool
- deleted_file: bool
- diff
- new_file: bool
- raw_rename_from
- raw_rename_to
- re_header = re.compile(b'\n ^diff[ ]--git\n [ ](?P<a_path_fallback>"?[ab]/.+?"?)[ ](?P<b_path_fallback>"?[ab]/.+?"?)\\n\n (?:^, re.MULTILINE|re.VERBOSE)
- property rename_from: str | None
- property rename_to: str | None
- property renamed: bool
Deprecated, use
renamed_file
instead.- Returns:
True
if the blob of our diff has been renamed- Note:
This property is deprecated. Please use the
renamed_file
property instead.
- property renamed_file: bool
- Returns:
True
if the blob of our diff has been renamed
- score
- class git.diff.DiffConstants(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)
Special objects for
Diffable.diff()
.See the
Diffable.diff()
method’sother
parameter, which accepts various values including these.- Note:
These constants are also available as attributes of the
git.diff
module, theDiffable
class and its subclasses and instances, and the top-levelgit
module.
- INDEX = 2
Stand-in indicating you want to diff against the index.
Also accessible as
git.INDEX
,git.diff.INDEX
, andDiffable.INDEX
, as well asDiffable.Index
. The latter has been kept for backward compatibility and made an alias of this, so it may still be used.
- NULL_TREE = 1
Stand-in indicating you want to compare against the empty tree in diffs.
Also accessible as
git.NULL_TREE
,git.diff.NULL_TREE
, andDiffable.NULL_TREE
.
- __module__ = 'git.diff'
- class git.diff.DiffIndex(iterable=(), /)
An index for diffs, allowing a list of
Diff
s to be queried by the diff properties.The class improves the diff handling convenience.
- __annotations__ = {}
- __dict__ = mappingproxy({'__module__': 'git.diff', '__doc__': 'An index for diffs, allowing a list of :class:`Diff`\\s to be queried by the diff\n properties.\n\n The class improves the diff handling convenience.\n ', 'change_type': ('A', 'C', 'D', 'R', 'M', 'T'), 'iter_change_type': <function DiffIndex.iter_change_type>, '__orig_bases__': (typing.List[~T_Diff],), '__dict__': <attribute '__dict__' of 'DiffIndex' objects>, '__weakref__': <attribute '__weakref__' of 'DiffIndex' objects>, '__parameters__': (~T_Diff,), '__annotations__': {}})
- __module__ = 'git.diff'
- __orig_bases__ = (typing.List[~T_Diff],)
- __parameters__ = (~T_Diff,)
- __weakref__
list of weak references to the object
- change_type = ('A', 'C', 'D', 'R', 'M', 'T')
Change type invariant identifying possible ways a blob can have changed:
A
= AddedD
= DeletedR
= RenamedM
= ModifiedT
= Changed in the type
- iter_change_type(change_type: Literal['A', 'D', 'C', 'M', 'R', 'T', 'U']) Iterator[T_Diff]
- Returns:
Iterator yielding
Diff
instances that match the given change_type- Parameters:
change_type –
Member of
DiffIndex.change_type
, namely:’A’ for added paths
’D’ for deleted paths
’R’ for renamed paths
’M’ for paths with modified data
’T’ for changed in the type paths
- class git.diff.Diffable
Common interface for all objects that can be diffed against another object of compatible type.
- Note:
Subclasses require a
repo
member, as it is the case forObject
instances. For practical reasons we do not derive fromObject
.
- INDEX = 2
Stand-in indicating you want to diff against the index.
See the
diff()
method, which accepts this as a value of itsother
parameter.This is the same as
DiffConstants.INDEX
, and may also be accessed asgit.INDEX
andgit.diff.INDEX
, as well asDiffable.INDEX
, which is kept for backward compatibility (it is now defined an alias of this).
- Index = 2
Stand-in indicating you want to diff against the index (same as
INDEX
).This is an alias of
INDEX
, for backward compatibility. SeeINDEX
anddiff()
for details.- Note:
Although always meant for use as an opaque constant, this was formerly defined as a class. Its usage is unchanged, but static type annotations that attempt to permit only this object must be changed to avoid new mypy errors. This was previously not possible to do, though
Type[Diffable.Index]
approximated it. It is now possible to do precisely, usingLiteral[DiffConstants.INDEX]
.
- NULL_TREE = 1
Stand-in indicating you want to compare against the empty tree in diffs.
See the
diff()
method, which accepts this as a value of itsother
parameter.This is the same as
DiffConstants.NULL_TREE
, and may also be accessed asgit.NULL_TREE
andgit.diff.NULL_TREE
.
- __annotations__ = {'repo': 'Repo'}
- __module__ = 'git.diff'
- __slots__ = ()
- diff(other: DiffConstants | Tree | Commit | str | None = DiffConstants.INDEX, paths: str | os.PathLike[str] | List[str | os.PathLike[str]] | Tuple[str | os.PathLike[str], ...] | None = None, create_patch: bool = False, **kwargs: Any) DiffIndex[Diff]
Create diffs between two items being trees, trees and index or an index and the working tree. Detects renames automatically.
- Parameters:
other –
This the item to compare us with.
If
None
, we will be compared to the working tree.If a
Tree_ish
or string, it will be compared against the respective tree.If
INDEX
, it will be compared against the index.If
NULL_TREE
, it will compare against the empty tree.
This parameter defaults to
INDEX
(rather thanNone
) so that the method will not by default fail on bare repositories.paths – This a list of paths or a single path to limit the diff to. It will only include at least one of the given path or paths.
create_patch – If
True
, the returnedDiff
contains a detailed patch that if applied makes the self to other. Patches are somewhat costly as blobs have to be read and diffed.kwargs – Additional arguments passed to git-diff(1), such as
R=True
to swap both sides of the diff.
- Returns:
A
DiffIndex
representing the computed diff.- Note:
On a bare repository, other needs to be provided as
INDEX
, or as an instance ofTree
orCommit
, or a git command error will occur.
- git.diff.INDEX: INDEX: 2>] = DiffConstants.INDEX
Stand-in indicating you want to diff against the index.
See
Diffable.diff()
, which accepts this as a value of itsother
parameter.This is an alias of
DiffConstants.INDEX
, which may also be accessed asgit.INDEX
andDiffable.INDEX
, as well asDiffable.Index
.
- git.diff.NULL_TREE: NULL_TREE: 1>] = DiffConstants.NULL_TREE
Stand-in indicating you want to compare against the empty tree in diffs.
See
Diffable.diff()
, which accepts this as a value of itsother
parameter.This is an alias of
DiffConstants.NULL_TREE
, which may also be accessed asgit.NULL_TREE
andDiffable.NULL_TREE
.
Exceptions
Exceptions thrown throughout the git package.
- exception git.exc.AmbiguousObjectName
Thrown if a possibly shortened name does not uniquely represent a single object in the database
- __module__ = 'gitdb.exc'
- exception git.exc.BadName
A name provided to rev_parse wasn’t understood
- __annotations__ = {}
- __module__ = 'gitdb.exc'
- __str__()
Return str(self).
- exception git.exc.BadObject
The object with the given SHA does not exist. Instantiate with the failed sha
- __annotations__ = {}
- __module__ = 'gitdb.exc'
- __str__()
Return str(self).
- exception git.exc.BadObjectType
The object had an unsupported type
- __annotations__ = {}
- __module__ = 'gitdb.exc'
- exception git.exc.CacheError
Base for all errors related to the git index, which is called “cache” internally.
- __annotations__ = {}
- __module__ = 'git.exc'
- exception git.exc.CheckoutError(message: str, failed_files: Sequence[str | os.PathLike[str]], valid_files: Sequence[str | os.PathLike[str]], failed_reasons: List[str])
Thrown if a file could not be checked out from the index as it contained changes.
The
failed_files
attribute contains a list of relative paths that failed to be checked out as they contained changes that did not exist in the index.The
failed_reasons
attribute contains a string informing about the actual cause of the issue.The
valid_files
attribute contains a list of relative paths to files that were checked out successfully and hence match the version stored in the index.- __annotations__ = {}
- __init__(message: str, failed_files: Sequence[str | os.PathLike[str]], valid_files: Sequence[str | os.PathLike[str]], failed_reasons: List[str]) None
- __module__ = 'git.exc'
- __str__() str
Return str(self).
- exception git.exc.CommandError(command: List[str] | Tuple[str, ...] | str, status: str | int | None | Exception = None, stderr: bytes | str | None = None, stdout: bytes | str | None = None)
Base class for exceptions thrown at every stage of
Popen
execution.- Parameters:
command – A non-empty list of argv comprising the command-line.
- __annotations__ = {}
- __init__(command: List[str] | Tuple[str, ...] | str, status: str | int | None | Exception = None, stderr: bytes | str | None = None, stdout: bytes | str | None = None) None
- __module__ = 'git.exc'
- __str__() str
Return str(self).
- exception git.exc.GitCommandError(command: List[str] | Tuple[str, ...] | str, status: str | int | None | Exception = None, stderr: bytes | str | None = None, stdout: bytes | str | None = None)
Thrown if execution of the git command fails with non-zero status code.
- __annotations__ = {}
- __init__(command: List[str] | Tuple[str, ...] | str, status: str | int | None | Exception = None, stderr: bytes | str | None = None, stdout: bytes | str | None = None) None
- __module__ = 'git.exc'
- exception git.exc.GitCommandNotFound(command: List[str] | Tuple[str] | str, cause: str | Exception)
Thrown if we cannot find the
git
executable in thePATH
or at the path given by theGIT_PYTHON_GIT_EXECUTABLE
environment variable.- __annotations__ = {}
- __init__(command: List[str] | Tuple[str] | str, cause: str | Exception) None
- __module__ = 'git.exc'
- exception git.exc.GitError
Base class for all package exceptions.
- __annotations__ = {}
- __module__ = 'git.exc'
- __weakref__
list of weak references to the object
- exception git.exc.HookExecutionError(command: List[str] | Tuple[str, ...] | str, status: str | int | None | Exception, stderr: bytes | str | None = None, stdout: bytes | str | None = None)
Thrown if a hook exits with a non-zero exit code.
This provides access to the exit code and the string returned via standard output.
- __annotations__ = {}
- __init__(command: List[str] | Tuple[str, ...] | str, status: str | int | None | Exception, stderr: bytes | str | None = None, stdout: bytes | str | None = None) None
- __module__ = 'git.exc'
- exception git.exc.InvalidDBRoot
Thrown if an object database cannot be initialized at the given path
- __annotations__ = {}
- __module__ = 'gitdb.exc'
- exception git.exc.InvalidGitRepositoryError
Thrown if the given repository appears to have an invalid format.
- __annotations__ = {}
- __module__ = 'git.exc'
- exception git.exc.NoSuchPathError
Thrown if a path could not be access by the system.
- __annotations__ = {}
- __module__ = 'git.exc'
- __weakref__
list of weak references to the object
- exception git.exc.ODBError
All errors thrown by the object database
- __annotations__ = {}
- __module__ = 'gitdb.exc'
- __weakref__
list of weak references to the object
- exception git.exc.ParseError
Thrown if the parsing of a file failed due to an invalid format
- __annotations__ = {}
- __module__ = 'gitdb.exc'
- exception git.exc.RepositoryDirtyError(repo: Repo, message: str)
Thrown whenever an operation on a repository fails as it has uncommitted changes that would be overwritten.
- __annotations__ = {}
- __module__ = 'git.exc'
- __str__() str
Return str(self).
- exception git.exc.UnmergedEntriesError
Thrown if an operation cannot proceed as there are still unmerged entries in the cache.
- __annotations__ = {}
- __module__ = 'git.exc'
- exception git.exc.UnsafeOptionError
Thrown if unsafe options are passed without being explicitly allowed.
- __annotations__ = {}
- __module__ = 'git.exc'
- exception git.exc.UnsafeProtocolError
Thrown if unsafe protocols are passed without being explicitly allowed.
- __annotations__ = {}
- __module__ = 'git.exc'
Refs.symbolic
- class git.refs.symbolic.SymbolicReference(repo: Repo, path: str | os.PathLike[str], check_path: bool = False)
Special case of a reference that is symbolic.
This does not point to a specific commit, but to another
Head
, which itself specifies a commit.A typical example for a symbolic reference is
HEAD
.- __annotations__ = {'reference': typing.Union[ForwardRef('Head'), ForwardRef('TagReference'), ForwardRef('RemoteReference'), ForwardRef('Reference')]}
- __eq__(other: object) bool
Return self==value.
- __hash__() int
Return hash(self).
- __module__ = 'git.refs.symbolic'
- __ne__(other: object) bool
Return self!=value.
- __repr__() str
Return repr(self).
- __slots__ = ('repo', 'path')
- __str__() str
Return str(self).
- property abspath: str | PathLike[str]
- classmethod create(repo: Repo, path: str | os.PathLike[str], reference: SymbolicReference | str = 'HEAD', logmsg: str | None = None, force: bool = False, **kwargs: Any) T_References
Create a new symbolic reference: a reference pointing to another reference.
- Parameters:
repo – Repository to create the reference in.
path – Full path at which the new symbolic reference is supposed to be created at, e.g.
NEW_HEAD
orsymrefs/my_new_symref
.reference – The reference which the new symbolic reference should point to. If it is a commit-ish, the symbolic ref will be detached.
force – If
True
, force creation even if a symbolic reference with that name already exists. RaiseOSError
otherwise.logmsg – If not
None
, the message to append to the reflog. IfNone
, no reflog entry is written.
- Returns:
Newly created symbolic reference
- Raises:
OSError – If a (Symbolic)Reference with the same name but different contents already exists.
- Note:
This does not alter the current HEAD, index or working tree.
- classmethod delete(repo: Repo, path: str | os.PathLike[str]) None
Delete the reference at the given path.
- Parameters:
repo – Repository to delete the reference from.
path – Short or full path pointing to the reference, e.g.
refs/myreference
or justmyreference
, hencerefs/
is implied. Alternatively the symbolic reference to be deleted.
- classmethod dereference_recursive(repo: Repo, ref_path: str | os.PathLike[str] | None) str
- Returns:
hexsha stored in the reference at the given ref_path, recursively dereferencing all intermediate references as required
- Parameters:
repo – The repository containing the reference at ref_path.
- classmethod from_path(repo: Repo, path: str | os.PathLike[str]) T_References
Make a symbolic reference from a path.
- Parameters:
path – Full
.git
-directory-relative path name to the Reference to instantiate.- Note:
Use
to_full_path()
if you only have a partial path of a known Reference type.- Returns:
Instance of type
Reference
,Head
, orTag
, depending on the given path.
- property is_detached: bool
- Returns:
True
if we are a detached reference, hence we point to a specific commit instead to another reference.
- is_remote() bool
- Returns:
True if this symbolic reference points to a remote branch
- is_valid() bool
- Returns:
True
if the reference is valid, hence it can be read and points to a valid object or reference.
- classmethod iter_items(repo: Repo, common_path: str | os.PathLike[str] | None = None, *args: Any, **kwargs: Any) Iterator[T_References]
Find all refs in the repository.
- Parameters:
repo – The
Repo
.common_path – Optional keyword argument to the path which is to be shared by all returned Ref objects. Defaults to class specific portion if
None
, ensuring that only refs suitable for the actual class are returned.
- Returns:
A list of
SymbolicReference
, each guaranteed to be a symbolic ref which is not detached and pointing to a valid ref.The list is lexicographically sorted. The returned objects are instances of concrete subclasses, such as
Head
orTagReference
.
- log() RefLog
- Returns:
RefLog
for this reference. Its last entry reflects the latest change applied to this reference.- Note:
As the log is parsed every time, its recommended to cache it for use instead of calling this method repeatedly. It should be considered read-only.
- log_append(oldbinsha: bytes, message: str | None, newbinsha: bytes | None = None) RefLogEntry
Append a logentry to the logfile of this ref.
- Parameters:
oldbinsha – Binary sha this ref used to point to.
message – A message describing the change.
newbinsha – The sha the ref points to now. If None, our current commit sha will be used.
- Returns:
The added
RefLogEntry
instance.
- log_entry(index: int) RefLogEntry
- Returns:
RefLogEntry
at the given index- Parameters:
index – Python list compatible positive or negative index.
- Note:
This method must read part of the reflog during execution, hence it should be used sparingly, or only if you need just one index. In that case, it will be faster than the
log()
method.
- property name: str
- Returns:
In case of symbolic references, the shortest assumable name is the path itself.
- path
- property ref: SymbolicReference
Returns the Reference we point to
- property reference: SymbolicReference
Returns the Reference we point to
- rename(new_path: str | PathLike[str], force: bool = False) SymbolicReference
Rename self to a new path.
- Parameters:
new_path – Either a simple name or a full path, e.g.
new_name
orfeatures/new_name
. The prefixrefs/
is implied for references and will be set as needed. In case this is a symbolic ref, there is no implied prefix.force – If
True
, the rename will succeed even if a head with the target name already exists. It will be overwritten in that case.
- Returns:
self
- Raises:
OSError – If a file at path but with different contents already exists.
- repo
- set_commit(commit: Commit | SymbolicReference | str, logmsg: str | None = None) SymbolicReference
Like
set_object()
, but restricts the type of object to be aCommit
.- Raises:
ValueError – If commit is not a
Commit
object, nor does it point to a commit.- Returns:
self
- set_object(object: Commit | Tree | TagObject | Blob | SymbolicReference | str, logmsg: str | None = None) SymbolicReference
Set the object we point to, possibly dereference our symbolic reference first. If the reference does not exist, it will be created.
- Parameters:
object –
A refspec, a
SymbolicReference
or anObject
instance.SymbolicReference
instances will be dereferenced beforehand to obtain the git object they point to.Object
instances must represent git objects (AnyGitObject
).
logmsg – If not
None
, the message will be used in the reflog entry to be written. Otherwise the reflog is not altered.
- Note:
Plain
SymbolicReference
instances may not actually point to objects by convention.- Returns:
self
- set_reference(ref: Commit | Tree | TagObject | Blob | SymbolicReference | str, logmsg: str | None = None) SymbolicReference
Set ourselves to the given ref.
It will stay a symbol if the ref is a
Reference
.Otherwise a git object, specified as a
Object
instance or refspec, is assumed. If it is valid, this reference will be set to it, which effectively detaches the reference if it was a purely symbolic one.- Parameters:
ref – A
SymbolicReference
instance, anObject
instance (specifically anAnyGitObject
), or a refspec string. Only if the ref is aSymbolicReference
instance, we will point to it. Everything else is dereferenced to obtain the actual object.logmsg –
If set to a string, the message will be used in the reflog. Otherwise, a reflog entry is not written for the changed reference. The previous commit of the entry will be the commit we point to now.
See also:
log_append()
- Returns:
self
- Note:
This symbolic reference will not be dereferenced. For that, see
set_object()
.
- classmethod to_full_path(path: str | PathLike[str] | SymbolicReference) str | PathLike[str]
- Returns:
String with a full repository-relative path which can be used to initialize a
Reference
instance, for instance by usingReference.from_path
.
Refs.reference
- class git.refs.reference.Reference(repo: Repo, path: str | os.PathLike[str], check_path: bool = True)
A named reference to any object.
Subclasses may apply restrictions though, e.g., a
Head
can only point to commits.- __abstractmethods__ = frozenset({})
- __annotations__ = {'_id_attribute_': 'str', 'path': 'str', 'reference': "Union['Head', 'TagReference', 'RemoteReference', 'Reference']"}
- __init__(repo: Repo, path: str | os.PathLike[str], check_path: bool = True) None
Initialize this instance.
- Parameters:
repo – Our parent repository.
path – Path relative to the
.git/
directory pointing to the ref in question, e.g.refs/heads/master
.check_path – If
False
, you can provide any path. Otherwise the path must start with the default path prefix of this type.
- __module__ = 'git.refs.reference'
- __parameters__ = ()
- __slots__ = ()
- __str__() str
Return str(self).
- classmethod __subclasshook__(other)
Abstract classes can override this to customize issubclass().
This is invoked early on by abc.ABCMeta.__subclasscheck__(). It should return True, False or NotImplemented. If it returns NotImplemented, the normal algorithm is used. Otherwise, it overrides the normal algorithm (and the outcome is cached).
- classmethod iter_items(repo: Repo, common_path: str | os.PathLike[str] | None = None, *args: Any, **kwargs: Any) Iterator[T_References]
Equivalent to
SymbolicReference.iter_items
, but will return non-detached references as well.
- property name: str
- Returns:
(shortest) Name of this reference - it may contain path components
- property remote_head: _T
- property remote_name: _T
Refs.head
Some ref-based objects.
Note the distinction between the HEAD
and Head
classes.
- class git.refs.head.HEAD(repo: Repo, path: str | os.PathLike[str] = 'HEAD')
Special case of a
SymbolicReference
representing the repository’s HEAD reference.- __annotations__ = {'commit': 'Commit'}
- __module__ = 'git.refs.head'
- __slots__ = ()
- orig_head() SymbolicReference
- Returns:
SymbolicReference
pointing at the ORIG_HEAD, which is maintained to contain the previous value of HEAD.
- reset(commit: Commit | TagObject | SymbolicReference | str = 'HEAD', index: bool = True, working_tree: bool = False, paths: str | os.PathLike[str] | Sequence[str | os.PathLike[str]] | None = None, **kwargs: Any) HEAD
Reset our HEAD to the given commit optionally synchronizing the index and working tree. The reference we refer to will be set to commit as well.
- Parameters:
commit –
Commit
,Reference
, or string identifying a revision we should reset HEAD to.index – If
True
, the index will be set to match the given commit. Otherwise it will not be touched.working_tree – If
True
, the working tree will be forcefully adjusted to match the given commit, possibly overwriting uncommitted changes without warning. If working_tree isTrue
, index must beTrue
as well.paths – Single path or list of paths relative to the git root directory that are to be reset. This allows to partially reset individual files.
kwargs – Additional arguments passed to git-reset(1).
- Returns:
self
- class git.refs.head.Head(repo: Repo, path: str | os.PathLike[str], check_path: bool = True)
A Head is a named reference to a
Commit
. Every Head instance contains a name and aCommit
object.Examples:
>>> repo = Repo("/path/to/repo") >>> head = repo.heads[0] >>> head.name 'master' >>> head.commit <git.Commit "1c09f116cbc2cb4100fb6935bb162daa4723f455"> >>> head.commit.hexsha '1c09f116cbc2cb4100fb6935bb162daa4723f455'
- __abstractmethods__ = frozenset({})
- __annotations__ = {'_id_attribute_': 'str', 'path': 'str', 'reference': "Union['Head', 'TagReference', 'RemoteReference', 'Reference']"}
- __dict__ = mappingproxy({'__module__': 'git.refs.head', '__doc__': 'A Head is a named reference to a :class:`~git.objects.commit.Commit`. Every Head\n instance contains a name and a :class:`~git.objects.commit.Commit` object.\n\n Examples::\n\n >>> repo = Repo("/path/to/repo")\n >>> head = repo.heads[0]\n\n >>> head.name\n \'master\'\n\n >>> head.commit\n <git.Commit "1c09f116cbc2cb4100fb6935bb162daa4723f455">\n\n >>> head.commit.hexsha\n \'1c09f116cbc2cb4100fb6935bb162daa4723f455\'\n ', '_common_path_default': 'refs/heads', 'k_config_remote': 'remote', 'k_config_remote_ref': 'merge', 'delete': <classmethod(<function Head.delete>)>, 'set_tracking_branch': <function Head.set_tracking_branch>, 'tracking_branch': <function Head.tracking_branch>, 'rename': <function Head.rename>, 'checkout': <function Head.checkout>, '_config_parser': <function Head._config_parser>, 'config_reader': <function Head.config_reader>, 'config_writer': <function Head.config_writer>, '__dict__': <attribute '__dict__' of 'Head' objects>, '__weakref__': <attribute '__weakref__' of 'Head' objects>, '__parameters__': (), '_is_protocol': False, '__subclasshook__': <classmethod(<function _proto_hook>)>, '__abstractmethods__': frozenset(), '_abc_impl': <_abc._abc_data object>, '__annotations__': {'path': 'str', 'reference': "Union['Head', 'TagReference', 'RemoteReference', 'Reference']", '_id_attribute_': 'str'}})
- __module__ = 'git.refs.head'
- __parameters__ = ()
- classmethod __subclasshook__(other)
Abstract classes can override this to customize issubclass().
This is invoked early on by abc.ABCMeta.__subclasscheck__(). It should return True, False or NotImplemented. If it returns NotImplemented, the normal algorithm is used. Otherwise, it overrides the normal algorithm (and the outcome is cached).
- __weakref__
list of weak references to the object
- checkout(force: bool = False, **kwargs: Any) HEAD | Head
Check out this head by setting the HEAD to this reference, by updating the index to reflect the tree we point to and by updating the working tree to reflect the latest index.
The command will fail if changed working tree files would be overwritten.
- Parameters:
force – If
True
,