diff options
author | Zhong Jianxin <azuwis@gmail.com> | 2021-08-27 16:25:20 +0800 |
---|---|---|
committer | Zhong Jianxin <azuwis@gmail.com> | 2022-01-24 11:23:56 +0800 |
commit | d03a07d5a74ef780b9de78225a7d7d59db8f9169 (patch) | |
tree | d00dda0be68b3a3ab7efce2314fa23148ab01fc0 /pkgs | |
parent | e8d0231396d1642cefe7940b2897451fbf128729 (diff) |
fetchgit: Support sparse checkout
This allow git checkout small parts of a large repo, and avoid fetching unnecessary blobs from server.
Diffstat (limited to 'pkgs')
-rw-r--r-- | pkgs/build-support/fetchgit/builder.sh | 1 | ||||
-rw-r--r-- | pkgs/build-support/fetchgit/default.nix | 3 | ||||
-rwxr-xr-x | pkgs/build-support/fetchgit/nix-prefetch-git | 8 |
3 files changed, 10 insertions, 2 deletions
diff --git a/pkgs/build-support/fetchgit/builder.sh b/pkgs/build-support/fetchgit/builder.sh index 0047a335c76c6..c7c7d21709a14 100644 --- a/pkgs/build-support/fetchgit/builder.sh +++ b/pkgs/build-support/fetchgit/builder.sh @@ -11,6 +11,7 @@ $SHELL $fetcher --builder --url "$url" --out "$out" --rev "$rev" \ ${fetchLFS:+--fetch-lfs} \ ${deepClone:+--deepClone} \ ${fetchSubmodules:+--fetch-submodules} \ + ${sparseCheckout:+--sparse-checkout "$sparseCheckout"} \ ${branchName:+--branch-name "$branchName"} runHook postFetch diff --git a/pkgs/build-support/fetchgit/default.nix b/pkgs/build-support/fetchgit/default.nix index 3a05008dacb56..1b59668ce4bc7 100644 --- a/pkgs/build-support/fetchgit/default.nix +++ b/pkgs/build-support/fetchgit/default.nix @@ -15,6 +15,7 @@ in { url, rev ? "HEAD", md5 ? "", sha256 ? "", hash ? "", leaveDotGit ? deepClone , fetchSubmodules ? true, deepClone ? false , branchName ? null +, sparseCheckout ? "" , name ? urlToName url rev , # Shell code executed after the file has been fetched # successfully. This can do things like check or transform the file. @@ -74,7 +75,7 @@ stdenvNoCC.mkDerivation { else lib.fakeSha256; - inherit url rev leaveDotGit fetchLFS fetchSubmodules deepClone branchName postFetch; + inherit url rev leaveDotGit fetchLFS fetchSubmodules deepClone branchName sparseCheckout postFetch; postHook = if netrcPhase == null then null else '' ${netrcPhase} diff --git a/pkgs/build-support/fetchgit/nix-prefetch-git b/pkgs/build-support/fetchgit/nix-prefetch-git index be5068c7ad31c..4e6f25b8dd7d9 100755 --- a/pkgs/build-support/fetchgit/nix-prefetch-git +++ b/pkgs/build-support/fetchgit/nix-prefetch-git @@ -48,6 +48,7 @@ Options: --rev ref Any sha1 or references (such as refs/heads/master) --hash h Expected hash. --branch-name Branch name to check out into + --sparse-checkout Only fetch and checkout part of the repository. --deepClone Clone the entire repository. --no-deepClone Make a shallow clone of just the required ref. --leave-dotGit Keep the .git directories. @@ -75,6 +76,7 @@ for arg; do --hash) argfun=set_hashType;; --branch-name) argfun=set_branchName;; --deepClone) deepClone=true;; + --sparse-checkout) argfun=set_sparseCheckout;; --quiet) QUIET=true;; --no-deepClone) deepClone=;; --leave-dotGit) leaveDotGit=true;; @@ -96,7 +98,7 @@ for arg; do case $argfun in set_*) var=${argfun#set_} - eval $var=$arg + eval "$var=$(printf %q "$arg")" ;; esac argfun="" @@ -112,6 +114,10 @@ init_remote(){ local url=$1 clean_git init --initial-branch=master clean_git remote add origin "$url" + if [ -n "$sparseCheckout" ]; then + git config remote.origin.partialclonefilter "blob:none" + echo "$sparseCheckout" | git sparse-checkout set --stdin + fi ( [ -n "$http_proxy" ] && clean_git config http.proxy "$http_proxy" ) || true } |