git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 2/2] [RFC] push: allow delete single-level ref

From
ZheNing Hu via GitGitGadget <gitgitgadget@gmail.com>
Date
Feb 27, 2023, 01:57 UTC
Message-ID
<4dc75f5b9614477bf8b729af5d456e1a5531f6ac.1677463022.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1465.v3.git.1677463022.gitgitgadget@gmail.com>
From: ZheNing Hu <adlternative@gmail.com>

We discourage the creation/update of single-level refs because some upper-layer applications only work in specified reference namespaces, such as "refs/heads/*" or "refs/tags/*", these single-level refnames may not be recognized. However, we still hope users can delete them which have been created by mistake.

Therefore, when updating branches on the server with "git receive-pack", by checking whether it is a branch deletion operation, it will determine whether to allow the update of a single-level refs. This avoids creating/updating such single-level refs, but allows them to be deleted.

On the client side, "git push" also does not properly fill in the old-oid of single-level refs, which causes the server-side "git receive-pack" to think that the ref's old-oid has changed when deleting single-level refs, this causes the push to be rejected. So the solution is to fix the client to be able to delete single-level refs by properly filling old-oid.

Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
 builtin/receive-pack.c | 4 +++-
 connect.c              | 3 ++-
 t/t5516-fetch-push.sh  | 7 +++++++
 3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index c24616a3ac6..af61725a388 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1463,7 +1463,9 @@ static const char *update(struct command *cmd, struct shallow_info *si)
 		find_shared_symref(worktrees, "HEAD", name);
 
 	/* only refs/... are allowed */
-	if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
+	if (!starts_with(name, "refs/") ||
+	    check_refname_format(name + 5, is_null_oid(new_oid) ?
+				 REFNAME_ALLOW_ONELEVEL : 0)) {
 		rp_error("refusing to update funny ref '%s' remotely", name);
 		ret = "funny refname";
 		goto out;
diff --git a/connect.c b/connect.c
index 63e59641c0d..7a396ad72e9 100644
--- a/connect.c
+++ b/connect.c
@@ -30,7 +30,8 @@ static int check_ref(const char *name, unsigned int flags)
 		return 0;
 
 	/* REF_NORMAL means that we don't want the magic fake tag refs */
-	if ((flags & REF_NORMAL) && check_refname_format(name, 0))
+	if ((flags & REF_NORMAL) && check_refname_format(name,
+							 REFNAME_ALLOW_ONELEVEL))
 		return 0;
 
 	/* REF_HEADS means that we want regular branch heads */
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index f37861efc40..19ebefa5ace 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -903,6 +903,13 @@ test_expect_success 'push --delete refuses empty string' '
 	test_must_fail git push testrepo --delete ""
 '
 
+test_expect_success 'push --delete onelevel refspecs' '
+	mk_test testrepo heads/main &&
+	git -C testrepo update-ref refs/onelevel refs/heads/main &&
+	git push testrepo --delete refs/onelevel &&
+	test_must_fail git -C testrepo rev-parse --verify refs/onelevel
+'
+
 test_expect_success 'warn on push to HEAD of non-bare repository' '
 	mk_test testrepo heads/main &&
 	(
-- 
gitgitgadget
Previous: ZheNing HuNext: ZheNing Hu via GitGitGadget
Message 17 of 20 in “[RFC] push: allow delete one level ref”
  1. 0/2 [RFC] push: allow delete one level refZheNing Hu via GitGitGadget, Jan 17, 2023
  2. 1/2 receive-pack: fix funny ref error messsageZheNing Hu via GitGitGadget, Jan 17, 2023
  3. 2/2 [RFC] push: allow delete one level refZheNing Hu via GitGitGadget, Jan 17, 2023
  4. Ævar Arnfjörð BjarmasonJan 17, 2023
  5. ZheNing HuJan 19, 2023
  6. 0/2 [RFC] push: allow delete one level refZheNing Hu via GitGitGadget, Feb 4, 2023
  7. 1/2 receive-pack: fix funny ref error messsageZheNing Hu via GitGitGadget, Feb 4, 2023
  8. 2/2 [RFC] push: allow delete one level refZheNing Hu via GitGitGadget, Feb 4, 2023
  9. Junio C HamanoFeb 6, 2023
  10. ZheNing HuFeb 24, 2023
  11. Junio C HamanoFeb 24, 2023
  12. ZheNing HuFeb 25, 2023
  13. 0/2 [RFC] push: allow delete one level refZheNing Hu via GitGitGadget, Feb 27, 2023
  14. 1/2 receive-pack: fix funny ref error messsageZheNing Hu via GitGitGadget, Feb 27, 2023
  15. Junio C HamanoFeb 27, 2023
  16. ZheNing HuMar 1, 2023
  17. 2/2 [RFC] push: allow delete single-level refZheNing Hu via GitGitGadget, Feb 27, 2023
  18. 0/2 [RFC] push: allow delete one level refZheNing Hu via GitGitGadget, Mar 1, 2023
  19. 1/2 receive-pack: fix funny ref error messsageZheNing Hu via GitGitGadget, Mar 1, 2023
  20. 2/2 push: allow delete single-level refZheNing Hu via GitGitGadget, Mar 1, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.