Skip to content

Git fetcher: Don't create refs when fetching by revision#12386

Merged
Ericson2314 merged 3 commits intoNixOS:masterfrom
DeterminateSystems:git-fixes
Feb 5, 2025
Merged

Git fetcher: Don't create refs when fetching by revision#12386
Ericson2314 merged 3 commits intoNixOS:masterfrom
DeterminateSystems:git-fixes

Conversation

@edolstra
Copy link
Member

Motivation

This fixes a couple of issues with the Git fetcher:

  • When fetching by revision, don't create a ref named refs/head/<revision>. (This was caused by doing git fetch <revision>:<revision>.) This is unnecessary and triggers the next bug.

  • When parsing the output of git ls-remote --symref, make sure that the first line references HEAD, otherwise a line like

    5c4410e3b9891c05ab40d723de78c6f0be45ad30        refs/heads/5c4410e3b9891c05ab40d723de78c6f0be45ad30
    

    will cause 5c44... (created by the previous bug) to be interpreted as a ref, leading to errors like

    fatal: Refusing to point HEAD outside of refs/
    warning: could not update cached head 'd275d93aa0bb8a004939b2f1e87f559f989453be' for 'file:///tmp/repo'
    
  • Don't pass URL query parameters for file:// URLs. Git interprets them as part of the file name, so passing parameters like rev breaks. Only relevant for testing (when _NIX_FORCE_HTTP is set) and local bare repos.

Context


Add 👍 to pull requests you find important.

The Nix maintainer team uses a GitHub project board to schedule and track reviews.

Git interprets them as part of the file name, so passing parameters
like 'rev' breaks. Only relevant for testing (when _NIX_FORCE_HTTP is
set) and local bare repos.
This causes Git to create a local ref named refs/head/<rev>, e.g.

  $ git -C ~/.cache/nix/gitv3/11irpim06vj4h6c0w8yls6kx4hvl0qd0gr1fvk47n76g6wf1s1vk ls-remote --symref .
  5c4410e3b9891c05ab40d723de78c6f0be45ad30        refs/heads/5c4410e3b9891c05ab40d723de78c6f0be45ad30
  7f6bde8a20de4cccc2256f088bc5af9dbe38881d        refs/heads/7f6bde8a20de4cccc2256f088bc5af9dbe38881d

which confuses readHead(), leading to errors like

  fatal: Refusing to point HEAD outside of refs/
  warning: could not update cached head 'd275d93aa0bb8a004939b2f1e87f559f989453be' for 'file:///tmp/repo'
If we previously fetched by revision, the output of "git ls-remote"
won't start with the expected line like

  ref: refs/heads/master HEAD

but will be something like

  5c4410e3b9891c05ab40d723de78c6f0be45ad30        refs/heads/5c4410e3b9891c05ab40d723de78c6f0be45ad30

This then causes Nix to treat that revision as a refname, which then
leads to warnings like

  warning: could not update cached head '5c4410e3b9891c05ab40d723de78c6f0be45ad30' for 'file:///tmp/repo'
@github-actions github-actions bot added the fetching Networking with the outside (non-Nix) world, input locking label Jan 30, 2025
@nixos-discourse
Copy link

This pull request has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/error-when-using-input-in-a-flake/59772/5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fetching Networking with the outside (non-Nix) world, input locking

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

3 participants