Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →For a multi-repository project, make each build use the exact dependency commits recorded by its superproject, then configure every CI system to fetch those submodules with credentials that can read them. A Git submodule is not a copied directory: its gitlink pins a commit in another repository. That distinction is central to keeping builds reproducible when multiple repositories and CI systems are involved.
What a gitlink records—and what it does not
A submodule is a separate Git repository checked out beneath a superproject. The superproject’s tree contains a gitlink: an object name identifying the commit expected at that path. The submodule keeps its own history; its files and commits are not copied into the superproject’s history. Git describes the gitlink as the commit the superproject expects the submodule’s working directory to be at (Git: gitsubmodules).
As an Amazon Associate I earn from qualifying purchases.
The .gitmodules file maps a submodule’s logical name to its working-tree path and default clone URL. Relative URLs are resolved against the superproject’s origin, which can be convenient when related repositories move together. In a fork, however, that origin may change the resolution; GitLab recommends using absolute URLs when fork workflows are expected (GitLab: Using Git submodules in CI/CD).
Why an ordinary checkout may leave dependencies missing
Checking out the superproject does not by itself guarantee that submodule working trees are populated. Run git submodule update --init to initialize and check out the commit recorded by the superproject. By default, Git uses that recorded commit rather than the latest commit on a remote branch; the submodule will commonly be in a detached-HEAD state. Git documents the initialization and update behavior in its git-submodule reference.
#1 Best Overall
That detached state is useful for builds: it makes the checked-out dependency match the superproject’s recorded version. It is not the right place to casually develop a change. Make and publish the change in the submodule repository, then update and commit the gitlink in the superproject.
Update a submodule without losing the pin
- Enter the submodule and switch to an appropriate branch, or create one:
cd path/to/submodule && git switch -c my-change. - Make the change, commit it, and push that commit to the submodule’s remote.
- Return to the superproject and stage the submodule path:
cd ../.. && git add path/to/submodule. - Commit and push the superproject change. That commit records the new gitlink, allowing CI and other developers to check out the same dependency revision.
Git’s Pro Git submodule chapter provides further background on this workflow.
Rank #2
- Used Book in Good Condition
Make CI checkout match the recorded dependency commits
CI checkout has two distinct requirements: initialize the submodules, and authenticate to every repository that must be read. A provider’s “fetch submodules” setting handles the first only if the selected mode includes the dependencies you need. It does not automatically grant access to private repositories. If a submodule contains another submodule, configure recursive initialization and verify the behavior for the specific provider action or runner version in use.
- Reproducibility: build the gitlink commit recorded in the superproject, not a branch’s latest remote commit.
- Credentials: authorize the job to read each private dependency; a token that can read the current repository may not reach another one.
- Depth: if using shallow clones, configure submodule depth separately where the provider supports it.
- Runner isolation: avoid credentials or Git settings persisting between jobs on shared shell executors.
GitLab CI/CD: choose the submodule strategy and access
GitLab Runner uses GIT_SUBMODULE_STRATEGY to control initialization. Set it to normal for top-level submodules and recursive when nested submodules must also be initialized. GitLab also documents GIT_SUBMODULE_DEPTH, GIT_SUBMODULE_PATHS, and GIT_SUBMODULE_UPDATE_FLAGS; the submodule depth is independent of the main repository’s GIT_DEPTH. The --jobs update flag can fetch submodules in parallel. Consult the current GitLab Runner submodule configuration for supported settings and runner-version details.
Rank #3
For a private submodule fetched with CI_JOB_TOKEN, the upstream project must permit job-token access, and the user who triggered the job must have an appropriate role. A job token from one GitLab instance cannot authenticate to a submodule on another instance; use a credential authorized to read that external repository and store it as a protected, masked CI variable. Follow the current runner guidance for credentials used by Git commands inside submodule directories, since externalized credentials may not automatically carry into subsequent commands. Avoid persistent global credential changes on shell executors, where settings can affect later jobs.
GitHub Actions: checkout options do not expand token scope
The official actions/checkout action accepts submodules: true for submodules or submodules: recursive when nested dependencies are required. Its documentation says that github.token is scoped to the current repository. Private or internal secondary repositories therefore need the documented separate credential option and a token with suitable access. Check the exact action version, token permissions, and repository policy used by the workflow in the actions/checkout documentation.
Rank #4
Keep two CI systems coordinated without assuming one topology
“Dual CI” does not tell you whether both systems build every repository, one validates while another deploys, or each repository owns its own pipeline. There is no universal configuration implied by a project using five repositories. Decide and document these responsibilities before wiring triggers:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
- Which repository owns each component, and which repositories depend on it?
- Which CI system is authoritative for each test, build, or deployment check?
- What change triggers a run in another repository or CI system?
- How are the exact gitlink commits that passed testing promoted together?
A superproject commit can provide a record of a tested combination of dependency commits. Whether that should be the promotion unit depends on the project’s release and ownership model; independent repositories may still have their own release processes. Whatever the arrangement, ensure each system tests the intended recorded revisions rather than silently following moving remote heads.
Best Value
Why following a remote branch can undermine repeatability
GitLab documents the risk of using --remote to update submodules: it follows a remote branch rather than simply using the commit pinned by the superproject. That can make a later build use a different dependency without a corresponding superproject change. For most builds, GitLab recommends explicitly tracking submodule commits and updating them deliberately, for example with dependency automation (GitLab Runner configuration).
Use deliberate gitlink updates when you want a reviewable change that records which dependency revision was tested. If a workflow intentionally tracks a branch head, treat that as a different policy: document it, make the resulting revision visible in the build record, and do not confuse it with a build pinned solely by the superproject.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →




