Currently there is no way to avoid the "--mirror" argument when doing an
initial clone.  This is problematic in that there are now a significant
number of repos out there for which we want the content, but creating a
full mirror clone isn't practical or efficient.

The two most common examples are:

1) Repos that have "ingested" another repo with no common ancestors - we
see this in "stable-queue" and "linux-rt-devel" repos[1] which started
as repos of queued format-patch output, but then also added the baseline
so the patches could be obtained "pre-applied" for easier automated testing.
Obviously, ingesting all of the linux history grows a repo by gigabytes.

2) Repos that have gone forward in time in a direction we don't care about,
say for example a flag day event, where everything was rewritten from C into
rust in one massive commit, or where a merge of a giant wad of orthogonal
history and/or binary/proprietary content "pollutes" the repo.

In both cases, we can solve the problem by using "--single-branch"
optionally in conjunction with "--branch <goodstuff>" in order to limit
the cloned content to a specific branch or tag.  We will only get
content up to that point, and any commits/ancestors leading up to that
point.  The clone is fully functional and without any of the limitatons
imposed by shallow clones.

So, in case #1 we simply choose the branch we want - raw unapplied
content, or applied and tagged (and perhaps signed) - but we aren't
subjected to downloading both branches.   In case #2 we simply specify
the last known "good" tag before the upstream went off in a direction
that we don't care about.

Note that default behaviour is unchanged - so this is an opt-in feature
which won't impact any existing recipes.  We also leave the door open
for it being URL specific via <name> since we know we have multi repo
SRC_URI in recipes-kernel already.

[1] git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
    git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git

Signed-off-by: Paul Gortmaker <paul.gortma...@windriver.com>
---
 bitbake/lib/bb/fetch2/git.py           | 3 ++-
 documentation/ref-manual/variables.rst | 8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
index e3ba80a3f52a..22281e2cfb98 100644
--- a/bitbake/lib/bb/fetch2/git.py
+++ b/bitbake/lib/bb/fetch2/git.py
@@ -345,10 +345,11 @@ class Git(FetchMethod):
 
         # If the repo still doesn't exist, fallback to cloning it
         if not os.path.exists(ud.clonedir):
+            extcloneargs = d.getVar('GITCLONEARGS_' + ud.names[0]) or 
d.getVar('GITCLONEARGS') or "--bare --mirror"
             # We do this since git will use a "-l" option automatically for 
local urls where possible
             if repourl.startswith("file://"):
                 repourl = repourl[7:]
-            clone_cmd = "LANG=C %s clone --bare --mirror %s %s --progress" % 
(ud.basecmd, shlex.quote(repourl), ud.clonedir)
+            clone_cmd = "LANG=C %s clone %s %s %s --progress" % (ud.basecmd, 
extcloneargs, shlex.quote(repourl), ud.clonedir)
             if ud.proto.lower() != 'file':
                 bb.fetch2.check_network_access(d, clone_cmd, ud.url)
             progresshandler = GitProgressHandler(d)
diff --git a/documentation/ref-manual/variables.rst 
b/documentation/ref-manual/variables.rst
index 0310429bdcab..cd2b77604e87 100644
--- a/documentation/ref-manual/variables.rst
+++ b/documentation/ref-manual/variables.rst
@@ -2649,6 +2649,14 @@ system and gives an overview of their function and 
contents.
    :term:`GDB`
       The minimal command and arguments to run the GNU Debugger.
 
+   :term:`GITCLONEARGS`
+      The arguments used to "git clone" when cloning a repo from an
+      an external server into the local download area.  The default is
+      "--bare --mirror".  Use of "--bare --single-branch --branch foo"
+      will limit what is cloned/downloaded just to the branch/tag "foo".
+      An URL specific GITCLONEARGS_<name> will take precedence over a
+      recipe wide GITCLONEARGS setting, if both are present.
+
    :term:`GITDIR`
       The directory in which a local copy of a Git repository is stored
       when it is cloned.
-- 
2.25.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#9636): 
https://lists.yoctoproject.org/g/linux-yocto/message/9636
Mute This Topic: https://lists.yoctoproject.org/mt/81808151/21656
Group Owner: linux-yocto+ow...@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to