diff --git a/doc/manual/expressions/builtins.xml b/doc/manual/expressions/builtins.xml
index a87639a07..69123fff0 100644
--- a/doc/manual/expressions/builtins.xml
+++ b/doc/manual/expressions/builtins.xml
@@ -425,6 +425,13 @@ stdenv.mkDerivation { … }
This is often a branch or tag name. Defaults to
HEAD.
+
+
+ By default, the ref value is prefixed
+ with refs/heads/. As of Nix 2.3.0
+ Nix will not prefix refs/heads/ if
+ ref starts with refs/.
+
@@ -438,6 +445,14 @@ stdenv.mkDerivation { … }
}
+
+ Fetching an arbitrary ref
+ builtins.fetchGit {
+ url = "https://gitub.com/NixOS/nix.git";
+ ref = "refs/heads/0.5-release";
+}
+
+
Fetching a repository's specific commit on an arbitrary branch
diff --git a/doc/manual/release-notes/release-notes.xml b/doc/manual/release-notes/release-notes.xml
index e8ff586fa..2655d68e3 100644
--- a/doc/manual/release-notes/release-notes.xml
+++ b/doc/manual/release-notes/release-notes.xml
@@ -12,6 +12,7 @@
-->
+
diff --git a/doc/manual/release-notes/rl-2.3.xml b/doc/manual/release-notes/rl-2.3.xml
new file mode 100644
index 000000000..428213b36
--- /dev/null
+++ b/doc/manual/release-notes/rl-2.3.xml
@@ -0,0 +1,22 @@
+
+
+Release 2.3 (????-??-??)
+
+This release contains the following changes:
+
+
+
+
+ builtins.fetchGit's ref
+ argument now allows specifying an absolute remote ref.
+ Nix will automatically prefix ref with
+ refs/heads only if ref doesn't
+ already begin with refs/.
+
+
+
+
diff --git a/src/libexpr/primops/fetchGit.cc b/src/libexpr/primops/fetchGit.cc
index 3dcf3e9ff..6229fef8d 100644
--- a/src/libexpr/primops/fetchGit.cc
+++ b/src/libexpr/primops/fetchGit.cc
@@ -94,7 +94,11 @@ GitInfo exportGit(ref store, const std::string & uri,
runProgram("git", true, { "init", "--bare", cacheDir });
}
- Path localRefFile = cacheDir + "/refs/heads/" + *ref;
+ Path localRefFile;
+ if (ref->compare(0, 5, "refs/") == 0)
+ localRefFile = cacheDir + "/" + *ref;
+ else
+ localRefFile = cacheDir + "/refs/heads/" + *ref;
bool doFetch;
time_t now = time(0);