Skip to Content
SourcesGit Repository

Git Repository

Git Repository

Scan the source, configuration, and documents on one branch of any Git repository — GitHub, GitLab, Bitbucket, Azure DevOps, or self-hosted.

Category
Code Repositories
Source type
GIT
Produces
fileimageaudiovideoarchive

Source repositories are where credentials go to hide — a key in a config file, a token in a test fixture, a customer export committed “just for debugging”. This source scans the files on one branch of a repository, provider-agnostically.

What you need to connect

A repository URL. Everything is done over the standard Git protocol rather than a provider API, so GitHub, GitLab, Bitbucket, Azure DevOps, Gitea and a bare repository on a server are all the same source.

Auth methodWhat you supply
NoneNothing — a public repository over HTTPS
TokenA personal access, deploy, or app installation token with read access
BasicUsername and password
SSH keyAn OpenSSH private key, optional passphrase, and known_hosts
Client certificateA PEM certificate and key, for mutual-TLS servers

For an internal server with a private CA, paste the CA bundle rather than turning off certificate verification.

What Classifyre reads

The files on one branch or tag — the working tree, not the history. Scan a second branch by adding a second source.

Narrow it with include and exclude path globs (src/config, **/*.sql, node_modules) and extension filters. .env, .py, .yaml, .tf and .sql are usually where the interesting things are.

Shared behaviour · File and object sources

Every object in the repository becomes one asset. What it is — a PDF, a spreadsheet, a screenshot, a video — is worked out from the bytes themselves, not from the file name, because storage systems routinely label everything as generic binary data. The full list of readable types is on File Formats.

Files hidden inside other files are pulled out and scanned in their own right: images embedded in a document, and every member of a ZIP, TAR, 7z or RAR archive. Images, audio and video need OCR and transcription switched on before their content can be read.

Large objects are streamed rather than loaded whole, so a multi-gigabyte file costs disk rather than memory, and only the part a sampling window asks for is read.

Files in this repository are read with the shared file pipeline: see Supported File Formats for everything it can open, and OCR & Transcription for reading text out of images, audio and video.

Metadata on every asset

Asset kind · file

FieldTypeAlways presentWhat it is
size_bytesintegerYesRaw byte size of the content
mime_typestringYesResolved MIME type
parse_errorstringNoSet when content extraction failed
image_widthintegerNoWidth in pixels
image_heightintegerNoHeight in pixels
page_countintegerNoNumber of pages (pdf)
paragraph_countintegerNoNumber of paragraphs (docx)
table_countintegerNoNumber of tables (docx)
row_countintegerNoNumber of data rows
columnsobject[]NoColumns as {name, type} objects (type may be empty for csv/xlsx)
encodingstringNoDetected character encoding
json_root_typestringNoRoot JSON type: object, array, or scalar
top_level_keysintegerNoNumber of top-level keys when the root is an object
array_lengthintegerNoLength when the root is an array
providerstringYesStorage provider label
object_keystringYesFile path relative to the repository root
repository_urlstringYesRepository the file was read from, with any credentials removed
branchstringNoBranch or tag that was scanned
commit_shastringNoCommit the file was read at
blob_idstringNoGit object id (OID) of the file blob — a hash of its contents
etagstringNoContent digest of the file: the Git blob OID
size_knownbooleanNoFalse when the file's bytes were not part of the initial transfer, so its size was not known at discovery time
lfs_pointerbooleanNoTrue when the tracked file is a Git LFS pointer rather than the payload
web_urlstringNoBrowser-accessible URL for the file, when the host is recognised
source_hashstringNoHash of the parent asset (embedded files and archive members only)
locationstringNoLocation within the parent (embedded file location or archive member path)

Asset kind · image

FieldTypeAlways presentWhat it is
size_bytesintegerYesRaw byte size of the content
mime_typestringYesResolved MIME type
parse_errorstringNoSet when content extraction failed
image_widthintegerNoWidth in pixels
image_heightintegerNoHeight in pixels
providerstringNoStorage provider label
object_keystringNoFile path relative to the repository root
repository_urlstringNoRepository the file was read from, with any credentials removed
branchstringNoBranch or tag that was scanned
commit_shastringNoCommit the file was read at
blob_idstringNoGit object id (OID) of the file blob — a hash of its contents
etagstringNoContent digest of the file: the Git blob OID
size_knownbooleanNoFalse when the file's bytes were not part of the initial transfer, so its size was not known at discovery time
lfs_pointerbooleanNoTrue when the tracked file is a Git LFS pointer rather than the payload
web_urlstringNoBrowser-accessible URL for the file, when the host is recognised
source_hashstringNoHash of the parent asset (embedded files and archive members only)
locationstringNoLocation within the parent (embedded file location or archive member path)

Asset kind · audio

FieldTypeAlways presentWhat it is
size_bytesintegerYesRaw byte size of the content
mime_typestringYesResolved MIME type
parse_errorstringNoSet when content extraction failed
providerstringYesStorage provider label
object_keystringYesFile path relative to the repository root
repository_urlstringYesRepository the file was read from, with any credentials removed
branchstringNoBranch or tag that was scanned
commit_shastringNoCommit the file was read at
blob_idstringNoGit object id (OID) of the file blob — a hash of its contents
etagstringNoContent digest of the file: the Git blob OID
size_knownbooleanNoFalse when the file's bytes were not part of the initial transfer, so its size was not known at discovery time
lfs_pointerbooleanNoTrue when the tracked file is a Git LFS pointer rather than the payload
web_urlstringNoBrowser-accessible URL for the file, when the host is recognised
source_hashstringNoHash of the parent asset (embedded files and archive members only)
locationstringNoLocation within the parent (embedded file location or archive member path)

Asset kind · video

FieldTypeAlways presentWhat it is
size_bytesintegerYesRaw byte size of the content
mime_typestringYesResolved MIME type
parse_errorstringNoSet when content extraction failed
providerstringYesStorage provider label
object_keystringYesFile path relative to the repository root
repository_urlstringYesRepository the file was read from, with any credentials removed
branchstringNoBranch or tag that was scanned
commit_shastringNoCommit the file was read at
blob_idstringNoGit object id (OID) of the file blob — a hash of its contents
etagstringNoContent digest of the file: the Git blob OID
size_knownbooleanNoFalse when the file's bytes were not part of the initial transfer, so its size was not known at discovery time
lfs_pointerbooleanNoTrue when the tracked file is a Git LFS pointer rather than the payload
web_urlstringNoBrowser-accessible URL for the file, when the host is recognised
source_hashstringNoHash of the parent asset (embedded files and archive members only)
locationstringNoLocation within the parent (embedded file location or archive member path)

Asset kind · archive

FieldTypeAlways presentWhat it is
size_bytesintegerYesRaw byte size of the content
mime_typestringYesResolved MIME type
parse_errorstringNoSet when content extraction failed
providerstringYesStorage provider label
object_keystringYesFile path relative to the repository root
repository_urlstringYesRepository the file was read from, with any credentials removed
branchstringNoBranch or tag that was scanned
commit_shastringNoCommit the file was read at
blob_idstringNoGit object id (OID) of the file blob — a hash of its contents
etagstringNoContent digest of the file: the Git blob OID
size_knownbooleanNoFalse when the file's bytes were not part of the initial transfer, so its size was not known at discovery time
lfs_pointerbooleanNoTrue when the tracked file is a Git LFS pointer rather than the payload
web_urlstringNoBrowser-accessible URL for the file, when the host is recognised
source_hashstringNoHash of the parent asset (embedded files and archive members only)
locationstringNoLocation within the parent (embedded file location or archive member path)

Lineage

Lineage

This source records no lineage. Nothing in the system it reads describes data moving from one place to another, so no FLOW edges are produced. Related items are still linked — see Lineage & Relationships for what those links mean and how they differ from lineage.

Worth knowing

  • Nothing is shared between runs. Each scan clones into its own throwaway workspace, so a scan can never be poisoned by a previous one.
  • Clone strategy controls the transfer cost. The default fetches the file tree plus the contents it needs rather than the whole history — a repository with a large past is not a large download.
  • Last-commit dates per file are optional; they’re what Latest sampling orders by, and they cost an extra pass over the branch.
  • Credentials never reach the disk in the clear, and are redacted from any Git error the scan reports.

Configuration

Beyond the fields below, every source also has the settings shared by all of them: the sampling strategy, the detectors to run, the scan schedule, and the compute limits for its scan jobs.

Required

Without these, the source will not save.

FieldTypeRequiredWhat it doesDefault
requiredobjectYesno extra properties
repository_urlstringYesRepository to scan. Works with GitHub, GitLab, Bitbucket, Azure DevOps, Gitea and any other Git server. Accepts https://host/org/repo.git, ssh://git@host/org/repo.git, or the scp-style git@host:org/repo.git.

Secrets

Stored encrypted and never shown again after you save them. See Configuration & Fields.

FieldTypeRequiredWhat it doesDefault
maskedobjectNoSecrets for the selected authentication method. Leave the whole block empty for a public repository. Every value is encrypted at rest and only ever materialised into a private, per-run directory that is deleted when the scan ends.no extra properties
ca_certificate_pemstringNoPEM certificate authority bundle used to verify the server, for an internal Git server with a private CA. Applies to any http(s) authentication method.
client_certificate_pemstringNoPEM client certificate for mutual-TLS authentication.
client_key_pemstringNoPEM private key matching the client certificate.
passwordstringNoPassword for basic authentication.
ssh_private_keystringNoOpenSSH private key in PEM form, including the BEGIN and END lines. Used with an ssh:// or git@host:org/repo.git URL.
ssh_private_key_passphrasestringNoPassphrase protecting the SSH private key, when it has one.
tokenstringNoPersonal access token, deploy token or app installation token with read access to the repository.
usernamestringNoUsername for basic authentication, or the token user for token authentication. Optional for tokens: the correct user for the detected host is used when this is empty (x-access-token for GitHub, oauth2 for GitLab, x-token-auth for Bitbucket).

Optional

Everything you can tune. Sensible defaults apply when you leave them alone.

FieldTypeRequiredWhat it doesDefault
optionalobjectNono extra properties
authobjectNoWhich credentials to use and how the server is verified.no extra properties
auth.auth_methodenumNoHow the scan authenticates to the Git server. none scans a public repository over http(s). token uses a personal access / deploy token (GitHub, GitLab, Bitbucket, Azure DevOps). basic uses a username and password. ssh_key uses an SSH private key with an ssh:// or git@host:org/repo.git URL. client_certificate uses mutual TLS against an enterprise Git server. Credentials are never written to the runner's git configuration: they are materialised into a private, per-run directory that is deleted when the scan ends. Allowed: none, token, basic, ssh_key, client_certificatenone
auth.ssh_known_hostsstringNoknown_hosts entries for the Git server, one per line (the output of ssh-keyscan host). Required for SSH unless host key checking is turned off.
auth.ssh_strict_host_key_checkingbooleanNoRefuse to connect over SSH to a host that is not in ssh_known_hosts. Leave on unless you are connecting to a server whose host key you cannot pin.true
auth.verify_sslbooleanNoVerify the server's TLS certificate on http(s) remotes. Turn off only for an internal server with a self-signed certificate; prefer ca_certificate_pem.true
connectionobjectNoHow the repository is transferred and how much of one file may be held at once. Every run clones into its own empty directory and deletes it afterwards — nothing is shared or cached between runs or between sources.no extra properties
connection.clone_strategyenumNoHow much of the repository is transferred up front. blob_limit (recommended) fetches the file tree plus the contents of every file at or below the memory threshold in one pack, and leaves larger files to be fetched individually only if the scan reaches them. blobless fetches the file tree only, so every file is catalogued from Git metadata and downloaded one at a time as it is scanned — the cheapest option for a very large repository where only a slice is sampled, at the cost of one request per file and unknown file sizes until a file is read. full transfers every file in the commit up front. Allowed: blob_limit, blobless, fullblob_limit
connection.clone_timeout_secondsnumberNoTime limit for the initial clone.min 30, max 864001800
connection.command_timeout_secondsnumberNoTime limit for each subsequent Git command, including fetching one file.min 5, max 3600300
connection.depthintegerNoHow many commits of history to fetch. 1 (default) fetches only the commit being scanned. 0 fetches the full history, which is what per-file commit dates need.min 0, max 10001
connection.max_archive_member_bytesintegerNoMaximum uncompressed bytes read from a single archive membermin 102410485760
connection.max_archive_membersintegerNoMaximum member files expanded from one archive into child assets. Bounds fan-out, and is the guard against a zip bomb.min 1, max 10000200
connection.max_archive_total_bytesintegerNoMaximum uncompressed bytes read across all members of one archive. The decompression-ratio ceiling: a zip bomb hits this before it hits memory.min 1024104857600
connection.max_embedded_filesintegerNoMaximum embedded files (parquet image/audio columns, office media) expanded from one container into child assets per runmin 1, max 10000200
connection.max_file_bytesintegerNoRefuse any file larger than this many bytes. 0 or unset means no limit: a file above max_object_bytes is spooled to disk rather than held in memory, so file size is bounded by free disk, not by RAM.min 0
connection.max_object_bytesintegerNoMaximum bytes of one file held in memory. Larger files are streamed to a temporary file, so this bounds memory rather than the size of file that can be scanned. Also the threshold used by the blob_limit clone strategy. See max_file_bytes to refuse large files outright.min 102426214400
scopeobjectNoWhich branch is read and which files inside it become assets. One branch is scanned per source; add a second source to scan a second branch.no extra properties
scope.branchstringNoBranch or tag to scan, for example main or release/2026-01. Defaults to the repository's default branch.
scope.exclude_extensionsarrayNoOptional extension denylist (for example, .png, .lock, .min.js)
scope.exclude_extensions[]stringNo
scope.exclude_pathsarrayNoFolders or glob patterns to skip, for example node_modules, vendor or **/fixtures/*. Applied after include_paths, so an excluded folder inside an included one is still skipped.
scope.exclude_paths[]stringNo
scope.include_content_previewbooleanNoRead file contents to infer type and extract detector-ready text. Turn off for a metadata-only inventory of the repository.true
scope.include_empty_objectsbooleanNoInclude zero-byte files in extraction resultsfalse
scope.include_extensionsarrayNoOptional extension allowlist (for example, .py, .sql, .env, .md)
scope.include_extensions[]stringNo
scope.include_last_commitbooleanNoRecord each file's own last-commit date, which is what LATEST and AUTOMATIC sampling order by. Needs the branch's commit history, so it makes the initial transfer larger. When off, every file inherits the date of the scanned commit.false
scope.include_object_metadatabooleanNoAttach Git metadata (blob object id, size, commit) to asset checksums. The blob id is a content hash, so leaving this on lets an unchanged file be skipped on the next run without re-reading it.true
scope.include_pathsarrayNoFolders or glob patterns to scan, for example docs, src/config or **/*.sql. A file is kept when it matches at least one entry. Leave empty to scan the whole repository.
scope.include_paths[]stringNo
Last updated on