From: "Glen Choo via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Philippe Blain <levraiphilippeblain@gmail.com>,
Glen Choo <chooglen@google.com>
Subject: [PATCH 0/6] clone, submodule update: check out submodule branches
Date: Mon, 29 Aug 2022 20:54:10 +0000 [thread overview]
Message-ID: <pull.1321.git.git.1661806456.gitgitgadget@gmail.com> (raw)
= Description
This series teaches "git clone --recurse-submodules" and "git submodule
update" to understand "submodule.propagateBranches" (see Further Reading for
context), i.e. if the superproject has a branch checked out and a submodule
is cloned, the submodule will have the same branch checked out.
To do this, "git submodule update" checks if "submodule.propagateBranches"
is true, and if so, gets the current superproject branch and updates the
submodule by running "git checkout -b my-superproject-branch". Since "git
clone --recurse-submodules" is implemented using "git submodule update", it
also learns this trick.
The main challenges with this approach are:
* If the remote HEAD points to a branch, "git clone" always creates that
branch in the clone. But with "submodule.propagateBranches", we want
submodules to use the branch names of their superproject, not their
upstream.
This is solved by adding a new flag to "git clone", "--detach", which
detaches the clone's HEAD at the branch and does not create it.
* When "git submodule update" recurses into submodules, the parent process
has to propagate the value of "submodule.propagateBranches" to child
processes, otherwise the behavior will be inconsistent if the submodule
has the config unset.
This is solved by adding an internal GIT_* environment variable and
passing it down via prepare_submodule_repo_env(). This is cleaner than
passing "-c submodule.propagateBranches=true", but an even cleaner
solution would be for submodules to read "submodule.propagateBranches"
from their superproject config. This would also be useful for
"submodule.alternateLocation" and "submodule.alternateErrorStrategy", as
we wouldn't have to set those values in newly-cloned submodules. This
requires teaching Git to treat submodules differently, which was the
subject of some WIP in [1]. That topic has stalled, but I don't mind
restarting it if others prefer that.
[1]
https://lore.kernel.org/git/20220310004423.2627181-1-emilyshaffer@google.com/
= Patch organization
* Patch 1/6 adds "--detach" to "git clone"
* Patch 2/6 creates the environment variable and repository setting for
"submodule.propagateBranches"
* Patches 3-5/6 are prep work, and 6/6 adds the actual
"submodule.propagateBranches" behavior
= Future work
* Patch 4, which refactors resolve_gitlink_ref(), notes that a better
interface would be to return the refname instead of using an "out"
parameter, but we use an "out" parameter so that any new callers trying
to use the old function signature will get stopped by the compiler. The
refactor can be finished at a later time.
= Further reading
Submodule branching RFC:
https://lore.kernel.org/git/kl6lv912uvjv.fsf@chooglen-macbookpro.roam.corp.google.com/
Original Submodule UX RFC/Discussion:
https://lore.kernel.org/git/YHofmWcIAidkvJiD@google.com/
Contributor Summit submodules Notes:
https://lore.kernel.org/git/nycvar.QRO.7.76.6.2110211148060.56@tvgsbejvaqbjf.bet/
Submodule UX overhaul updates:
https://lore.kernel.org/git/?q=Submodule+UX+overhaul+update
"git branch --recurse-submodules":
https://lore.kernel.org/git/20220129000446.99261-1-chooglen@google.com/
Glen Choo (6):
clone: teach --detach option
repo-settings: add submodule_propagate_branches
t5617: drop references to remote-tracking branches
submodule: return target of submodule symref
submodule--helper: refactor up-to-date criterion
clone, submodule update: check out branches
Documentation/git-clone.txt | 7 +++-
builtin/branch.c | 11 ++----
builtin/clone.c | 12 ++++--
builtin/submodule--helper.c | 37 +++++++++++++++++--
builtin/update-index.c | 4 +-
cache.h | 1 +
combine-diff.c | 3 +-
diff-lib.c | 2 +-
dir.c | 2 +-
object-file.c | 2 +-
read-cache.c | 4 +-
refs.c | 10 +++--
refs.h | 5 ++-
repo-settings.c | 11 +++---
repository.h | 1 +
submodule.c | 2 +
t/t5601-clone.sh | 22 +++++++++++
...es-remote.sh => t5617-clone-submodules.sh} | 36 +++++++++++++++++-
t/t7406-submodule-update.sh | 22 +++++++++++
unpack-trees.c | 3 +-
20 files changed, 161 insertions(+), 36 deletions(-)
rename t/{t5617-clone-submodules-remote.sh => t5617-clone-submodules.sh} (72%)
base-commit: 9bf691b78cf906751e65d65ba0c6ffdcd9a5a12c
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1321%2Fchooglen%2Fsubmodule%2Fclone-recursive-with-branch-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1321/chooglen/submodule/clone-recursive-with-branch-v1
Pull-Request: https://github.com/git/git/pull/1321
--
gitgitgadget
next reply other threads:[~2022-08-29 20:55 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-29 20:54 Glen Choo via GitGitGadget [this message]
2022-08-29 20:54 ` [PATCH 1/6] clone: teach --detach option Glen Choo via GitGitGadget
2022-08-30 4:02 ` Philippe Blain
2022-08-29 20:54 ` [PATCH 2/6] repo-settings: add submodule_propagate_branches Glen Choo via GitGitGadget
2022-08-30 4:02 ` Philippe Blain
2022-08-29 20:54 ` [PATCH 3/6] t5617: drop references to remote-tracking branches Glen Choo via GitGitGadget
2022-08-30 4:03 ` Philippe Blain
2022-08-29 20:54 ` [PATCH 4/6] submodule: return target of submodule symref Glen Choo via GitGitGadget
2022-09-01 20:01 ` Jonathan Tan
2022-09-01 20:46 ` Glen Choo
2022-08-29 20:54 ` [PATCH 5/6] submodule--helper: refactor up-to-date criterion Glen Choo via GitGitGadget
2022-08-29 20:54 ` [PATCH 6/6] clone, submodule update: check out branches Glen Choo via GitGitGadget
2022-08-30 4:03 ` Philippe Blain
2022-08-30 22:54 ` Glen Choo
2022-09-01 20:00 ` Jonathan Tan
2022-10-20 20:20 ` [PATCH v2 0/7] clone, submodule update: check out submodule branches Glen Choo via GitGitGadget
2022-10-20 20:20 ` [PATCH v2 1/7] clone: teach --detach option Glen Choo via GitGitGadget
2022-10-20 20:20 ` [PATCH v2 2/7] repo-settings: add submodule_propagate_branches Glen Choo via GitGitGadget
2022-10-25 18:03 ` Jonathan Tan
2022-10-20 20:20 ` [PATCH v2 3/7] submodule--helper clone: create named branch Glen Choo via GitGitGadget
2022-10-25 18:00 ` Jonathan Tan
2022-10-20 20:20 ` [PATCH v2 4/7] t5617: drop references to remote-tracking branches Glen Choo via GitGitGadget
2022-10-20 20:20 ` [PATCH v2 5/7] submodule: return target of submodule symref Glen Choo via GitGitGadget
2022-10-20 20:20 ` [PATCH v2 6/7] submodule update: refactor update targets Glen Choo via GitGitGadget
2022-10-20 20:20 ` [PATCH v2 7/7] clone, submodule update: create and check out branches Glen Choo via GitGitGadget
2022-10-25 17:56 ` Jonathan Tan
2022-10-25 21:49 ` Glen Choo
2022-10-20 22:40 ` [PATCH v2 0/7] clone, submodule update: check out submodule branches Junio C Hamano
2022-10-20 23:53 ` Glen Choo
2022-10-21 0:01 ` Junio C Hamano
2022-10-28 20:14 ` [PATCH v3 0/8] " Glen Choo via GitGitGadget
2022-10-28 20:14 ` [PATCH v3 1/8] clone: teach --detach option Glen Choo via GitGitGadget
2022-10-28 21:40 ` Junio C Hamano
2022-10-28 21:54 ` Junio C Hamano
2022-10-28 22:55 ` Glen Choo
2022-10-30 18:14 ` Taylor Blau
2022-10-31 17:07 ` Glen Choo
2022-11-08 13:32 ` Philippe Blain
2022-10-28 20:14 ` [PATCH v3 2/8] repo-settings: add submodule_propagate_branches Glen Choo via GitGitGadget
2022-10-28 20:14 ` [PATCH v3 3/8] submodule--helper clone: create named branch Glen Choo via GitGitGadget
2022-10-28 20:14 ` [PATCH v3 4/8] t5617: drop references to remote-tracking branches Glen Choo via GitGitGadget
2022-10-28 20:14 ` [PATCH v3 5/8] submodule: return target of submodule symref Glen Choo via GitGitGadget
2022-10-28 21:49 ` Junio C Hamano
2022-10-28 23:11 ` Glen Choo
2022-10-28 20:14 ` [PATCH v3 6/8] submodule update: refactor update targets Glen Choo via GitGitGadget
2022-10-28 20:14 ` [PATCH v3 7/8] submodule--helper: remove update_data.suboid Glen Choo via GitGitGadget
2022-11-14 23:45 ` Jonathan Tan
2022-10-28 20:14 ` [PATCH v3 8/8] clone, submodule update: create and check out branches Glen Choo via GitGitGadget
2022-11-08 13:53 ` Philippe Blain
2022-11-15 18:15 ` Jonathan Tan
2022-11-22 18:44 ` Glen Choo
2022-11-23 1:33 ` Jonathan Tan
2022-11-23 4:00 ` Junio C Hamano
2022-10-30 18:19 ` [PATCH v3 0/8] clone, submodule update: check out submodule branches Taylor Blau
2022-11-08 14:23 ` Philippe Blain
2022-11-08 20:43 ` Glen Choo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1321.git.git.1661806456.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=chooglen@google.com \
--cc=git@vger.kernel.org \
--cc=levraiphilippeblain@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).