Files
Gitea/modules/git/fetch.go
T
silverwind 20ea3e204d perf(repo): fetch the initial commit instead of pushing it (#39628)
Creating a repository with an initial commit, via `auto_init` or a
template with git content, pushed that commit through receive-pack and
three server-side hooks that do nothing for this internal push except
refresh server info. Fetching it into the bare repository instead makes
such repository creation about 3.7x faster locally (median 790ms to
214ms). E2E tests that create initialized repositories get about
0.2-0.3s faster each.

1. Run `update-server-info` after template content generation, which the
push's `post-receive` hook did before.
2. Remove the now unused `InternalPushingEnvironment` and
`PushOptions.LocalRefName`.
2026-10-06 14:39:36 +00:00

33 lines
1.5 KiB
Go

// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package git
import (
"context"
"gitea.dev/modules/git/gitcmd"
"gitea.dev/modules/git/gitrepo"
)
// FetchRemoteTempCommit fetches a specific commit and its related objects from a remote repository
// into the managed repository for temporary use (e.g.: compare, check merge base, etc.).
//
// If no reference (branch, tag, or other ref) points to the fetched commit, it will be treated as unreachable
// and cleaned up by auto-gc (a future push) or Gitea's "git gc" cronjob after the default prune expiration period.
// Ref: https://www.kernel.org/pub/software/scm/git/docs/git-gc.html
func FetchRemoteTempCommit(ctx context.Context, repo, remoteRepo RepositoryFacade, commitID string) error {
// since it is for temporary use, we don't need to update any ref or lock anything or maintain anything
return fetchRemoteCommand(remoteRepo, commitID).WithRepo(repo).Run(ctx)
}
// FetchRemoteCommitUpdateRef fetches a commit from a remote repository and points refName at it
func FetchRemoteCommitUpdateRef(ctx context.Context, repo, remoteRepo RepositoryFacade, commitish, refName string) error {
return fetchRemoteCommand(remoteRepo, "+"+commitish+":"+refName).WithRepo(repo).RunWithStderr(ctx)
}
func fetchRemoteCommand(remoteRepo RepositoryFacade, refspec string) *gitcmd.Command {
return gitcmd.NewCommand("fetch", "--no-tags", "--no-write-commit-graph", "--no-write-fetch-head", "--no-auto-maintenance").
AddDynamicArguments(gitrepo.RepoLocalPath(remoteRepo), refspec)
}