From: Junio C Hamano <gitster@pobox.com>
To: Bingwu Zhang <xtex@envs.net>
Cc: git@vger.kernel.org, Bingwu Zhang <xtex@aosc.io>, apenwarr@gmail.com
Subject: Re: [PATCH] contrib/subtree: verify HEAD is valid before adding a subtree
Date: Mon, 10 Feb 2025 08:28:46 -0800 [thread overview]
Message-ID: <xmqq8qqddarl.fsf@gitster.g> (raw)
In-Reply-To: <20250210021128.31083-2-xtex@envs.net> (Bingwu Zhang's message of "Mon, 10 Feb 2025 10:11:26 +0800")
Bingwu Zhang <xtex@envs.net> writes:
> From: Bingwu Zhang <xtex@aosc.io>
>
> After initializing a new repository or switching to a orphan branch,
> HEAD is a symbolic reference to refs/heads/xxx while the pointed branch
> head does not exist until a initial commit.
>
> "git subtree add" will try to ensure that working tree and index are
> clean, but as HEAD is invalid, diff-index always fails:
> fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
> Use '--' to separate paths from revisions, like this:
> 'git <command> [<revision>...] -- [<file>...]'
> fatal: working tree has modifications. Cannot add.
[Disclaimer. I do not use "git subtree" at all myself, and I may be
missing the usual expectation of end-users of that command in the
following description.]
Good finding. I can see that an unborn HEAD would cause the command
fail.
> It says "working tree has modifications" but it is not the case.
I am not sure if "it is not the case" is true, though. If the index
is empty (i.e. nothing has been added yet) and the HEAD is unborn,
shouldn't that state be considered that working tree has no
modifications? IOW, wouldn't this part of the code that uses
"diff-index HEAD" want to consider that an unborn HEAD equivalent to
an empty tree for the purpose of the comparison?
In short, "is not" -> "may not be", perhaps?
> Add a check using "git show-ref --verify" to ensure that HEAD is a valid
> reference and give a clearer error message.
And if we want to treat an unborn HEAD equivalent to an empty tree,
then dying upon seeing "show-ref" fail would not be a good solution
to the problem, no? Shouldn't the updated logic to deal with an
unborn HEAD be more like "if we see that the HEAD is unborn, then we
are happy iff the index is empty; if HEAD already points at a
commit, then we are happy iff the working tree has no changes
relative to it"?
> Signed-off-by: Bingwu Zhang <xtex@aosc.io>
> ---
> contrib/subtree/git-subtree.sh | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
> index 15ae86db1b27..41eb816e454a 100755
> --- a/contrib/subtree/git-subtree.sh
> +++ b/contrib/subtree/git-subtree.sh
> @@ -770,6 +770,11 @@ copy_or_skip () {
> # Usage: ensure_clean
> ensure_clean () {
> assert test $# = 0
> + # verify HEAD, or else "git diff-index HEAD" will fail
> + if ! git show-ref --verify --quiet HEAD 2>&1
> + then
> + die "fatal: HEAD is not a valid reference. Subtree cannot be committed as the first commit of a branch."
> + fi
> if ! git diff-index HEAD --exit-code --quiet 2>&1
> then
> die "fatal: working tree has modifications. Cannot add."
>
> base-commit: f93ff170b93a1782659637824b25923245ac9dd1
next prev parent reply other threads:[~2025-02-10 16:28 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-10 2:11 [PATCH] contrib/subtree: verify HEAD is valid before adding a subtree Bingwu Zhang
2025-02-10 16:28 ` Junio C Hamano [this message]
2025-02-11 1:13 ` Bingwu Zhang
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq8qqddarl.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=apenwarr@gmail.com \
--cc=git@vger.kernel.org \
--cc=xtex@aosc.io \
--cc=xtex@envs.net \
/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.
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 NNTP newsgroup(s).