# [PATCH] docs/gitcredentials: describe URL prefix matching

4 messages from 2025-10-01 to 2025-10-03. Participants: M Hickford via GitGitGadget, brian m. carlson, Junio C Hamano.
Thread: https://gitlist.dev/t/64236

## M Hickford via GitGitGadget, 2025-10-01 20:56

Subject: [PATCH] docs/gitcredentials: describe URL prefix matching
Message-ID: <pull.1979.git.1759352209657.gitgitgadget@gmail.com>
URL: https://gitlist.dev/e/pull.1979.git.1759352209657.gitgitgadget%40gmail.com

```
From: M Hickford <mirth.hickford@gmail.com>

Documentation was inaccurate since 9a121b0d226 (credential: handle
`credential.<partial-URL>.<key>` again, 2020-04-24)

Add tests for documented behaviour.

Signed-off-by: M Hickford <mirth.hickford@gmail.com>
---
    docs/gitcredentials: describe URL prefix matching

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1979%2Fhickford%2Furl-prefix-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1979/hickford/url-prefix-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1979

 Documentation/gitcredentials.adoc | 15 +++++++--------
 t/t0300-credentials.sh            | 19 +++++++++++++++----
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/Documentation/gitcredentials.adoc b/Documentation/gitcredentials.adoc
index 3337bb475d..60c2cc4ade 100644
--- a/Documentation/gitcredentials.adoc
+++ b/Documentation/gitcredentials.adoc
@@ -150,9 +150,8 @@ pattern in the config file. For example, if you have this in your config file:
 	username = foo
 --------------------------------------
 
-then we will match: both protocols are the same, both hosts are the same, and
-the "pattern" URL does not care about the path component at all. However, this
-context would not match:
+then we will match: both protocols are the same and both hosts are the same.
+However, this context would not match:
 
 --------------------------------------
 [credential "https://kernel.org"]
@@ -166,11 +165,11 @@ match: Git compares the protocols exactly.  However, you may use wildcards in
 the domain name and other pattern matching techniques as with the `http.<URL>.*`
 options.
 
-If the "pattern" URL does include a path component, then this too must match
-exactly: the context `https://example.com/bar/baz.git` will match a config
-entry for `https://example.com/bar/baz.git` (in addition to matching the config
-entry for `https://example.com`) but will not match a config entry for
-`https://example.com/bar`.
+If the "pattern" URL does include a path component, then this must match
+as a prefix path: the context `https://example.com/bar` will match a config
+entry for `https://example.com/bar/baz.git` but will not match a config entry for
+`https://example.com/other/repo.git` or `https://example.com/barry/repo.git`
+(even though it is a string prefix).
 
 
 CONFIGURATION OPTIONS
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index cb3a85c7ff..07aa834d33 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -991,18 +991,24 @@ test_expect_success 'url parser not confused by encoded markers' '
 
 test_expect_success 'credential config with partial URLs' '
 	echo "echo password=yep" | write_script git-credential-yep &&
-	test_write_lines url=https://user@example.com/repo.git >stdin &&
+	test_write_lines url=https://user@example.com/org/repo.git >stdin &&
 	for partial in \
 		example.com \
+		example.com/org/repo.git \
 		user@example.com \
+		user@example.com/org/repo.git \
 		https:// \
 		https://example.com \
 		https://example.com/ \
+		https://example.com/org \
+		https://example.com/org/ \
+		https://example.com/org/repo.git \
 		https://user@example.com \
 		https://user@example.com/ \
-		https://example.com/repo.git \
-		https://user@example.com/repo.git \
-		/repo.git
+		https://user@example.com/org \
+		https://user@example.com/org/ \
+		https://user@example.com/org/repo.git \
+		/org/repo.git
 	do
 		git -c credential.$partial.helper=yep \
 			credential fill <stdin >stdout &&
@@ -1012,7 +1018,12 @@ test_expect_success 'credential config with partial URLs' '
 
 	for partial in \
 		dont.use.this \
+		example.com/o \
+		user@example.com/o \
 		http:// \
+		https://example.com/o \
+		https://user@example.com/o \
+		/o \
 		/repo
 	do
 		git -c credential.$partial.helper=yep \

base-commit: 821f583da6d30a84249f75f33501504d597bc16b
-- 
gitgitgadget

```

## brian m. carlson, 2025-10-01 22:20

Subject: Re: [PATCH] docs/gitcredentials: describe URL prefix matching
Message-ID: <aN2pItzrFaga7m9z@fruit.crustytoothpaste.net>
URL: https://gitlist.dev/e/aN2pItzrFaga7m9z%40fruit.crustytoothpaste.net
In-Reply-To: <pull.1979.git.1759352209657.gitgitgadget@gmail.com>

```
On 2025-10-01 at 20:56:49, M Hickford via GitGitGadget wrote:
> diff --git a/Documentation/gitcredentials.adoc b/Documentation/gitcredentials.adoc
> index 3337bb475d..60c2cc4ade 100644
> --- a/Documentation/gitcredentials.adoc
> +++ b/Documentation/gitcredentials.adoc
> @@ -150,9 +150,8 @@ pattern in the config file. For example, if you have this in your config file:
>  	username = foo
>  --------------------------------------
>  
> -then we will match: both protocols are the same, both hosts are the same, and
> -the "pattern" URL does not care about the path component at all. However, this
> -context would not match:
> +then we will match: both protocols are the same and both hosts are the same.
> +However, this context would not match:
>  
>  --------------------------------------
>  [credential "https://kernel.org"]
> @@ -166,11 +165,11 @@ match: Git compares the protocols exactly.  However, you may use wildcards in
>  the domain name and other pattern matching techniques as with the `http.<URL>.*`
>  options.
>  
> -If the "pattern" URL does include a path component, then this too must match
> -exactly: the context `https://example.com/bar/baz.git` will match a config
> -entry for `https://example.com/bar/baz.git` (in addition to matching the config
> -entry for `https://example.com`) but will not match a config entry for
> -`https://example.com/bar`.
> +If the "pattern" URL does include a path component, then this must match
> +as a prefix path: the context `https://example.com/bar` will match a config
> +entry for `https://example.com/bar/baz.git` but will not match a config entry for
> +`https://example.com/other/repo.git` or `https://example.com/barry/repo.git`
> +(even though it is a string prefix).

This looks like a good description.

>  CONFIGURATION OPTIONS
> diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
> index cb3a85c7ff..07aa834d33 100755
> --- a/t/t0300-credentials.sh
> +++ b/t/t0300-credentials.sh
> @@ -991,18 +991,24 @@ test_expect_success 'url parser not confused by encoded markers' '
>  
>  test_expect_success 'credential config with partial URLs' '
>  	echo "echo password=yep" | write_script git-credential-yep &&
> -	test_write_lines url=https://user@example.com/repo.git >stdin &&
> +	test_write_lines url=https://user@example.com/org/repo.git >stdin &&
>  	for partial in \
>  		example.com \
> +		example.com/org/repo.git \
>  		user@example.com \
> +		user@example.com/org/repo.git \
>  		https:// \
>  		https://example.com \
>  		https://example.com/ \
> +		https://example.com/org \
> +		https://example.com/org/ \
> +		https://example.com/org/repo.git \
>  		https://user@example.com \
>  		https://user@example.com/ \
> -		https://example.com/repo.git \
> -		https://user@example.com/repo.git \
> -		/repo.git
> +		https://user@example.com/org \
> +		https://user@example.com/org/ \
> +		https://user@example.com/org/repo.git \
> +		/org/repo.git
>  	do
>  		git -c credential.$partial.helper=yep \
>  			credential fill <stdin >stdout &&
> @@ -1012,7 +1018,12 @@ test_expect_success 'credential config with partial URLs' '
>  
>  	for partial in \
>  		dont.use.this \
> +		example.com/o \
> +		user@example.com/o \
>  		http:// \
> +		https://example.com/o \
> +		https://user@example.com/o \
> +		/o \
>  		/repo
>  	do
>  		git -c credential.$partial.helper=yep \

I appreciate the additional tests here.
-- 
brian m. carlson (they/them)
Toronto, Ontario, CA

```

## M Hickford via GitGitGadget, 2025-10-03 20:58

Subject: [PATCH v2] docs/gitcredentials: describe URL prefix matching
Message-ID: <pull.1979.v2.git.1759525133638.gitgitgadget@gmail.com>
URL: https://gitlist.dev/e/pull.1979.v2.git.1759525133638.gitgitgadget%40gmail.com
In-Reply-To: <pull.1979.git.1759352209657.gitgitgadget@gmail.com>

```
From: M Hickford <mirth.hickford@gmail.com>

Documentation was inaccurate since 9a121b0d226 (credential: handle
`credential.<partial-URL>.<key>` again, 2020-04-24)

Add tests for documented behaviour.

Signed-off-by: M Hickford <mirth.hickford@gmail.com>
---
    docs/gitcredentials: describe URL prefix matching

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1979%2Fhickford%2Furl-prefix-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1979/hickford/url-prefix-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1979

Range-diff vs v1:

 1:  15f44a2ac5 ! 1:  4b64cf47e9 docs/gitcredentials: describe URL prefix matching
     @@ Documentation/gitcredentials.adoc: match: Git compares the protocols exactly.  H
      -entry for `https://example.com`) but will not match a config entry for
      -`https://example.com/bar`.
      +If the "pattern" URL does include a path component, then this must match
     -+as a prefix path: the context `https://example.com/bar` will match a config
     ++as a path prefix: the context `https://example.com/bar` will match a config
      +entry for `https://example.com/bar/baz.git` but will not match a config entry for
      +`https://example.com/other/repo.git` or `https://example.com/barry/repo.git`
     -+(even though it is a string prefix).
     ++(even though it is a string prefix). To match as a prefix, the pattern
     ++must include protocol and host.
       
       
       CONFIGURATION OPTIONS


 Documentation/gitcredentials.adoc | 16 ++++++++--------
 t/t0300-credentials.sh            | 19 +++++++++++++++----
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/Documentation/gitcredentials.adoc b/Documentation/gitcredentials.adoc
index 3337bb475d..bf595f7918 100644
--- a/Documentation/gitcredentials.adoc
+++ b/Documentation/gitcredentials.adoc
@@ -150,9 +150,8 @@ pattern in the config file. For example, if you have this in your config file:
 	username = foo
 --------------------------------------
 
-then we will match: both protocols are the same, both hosts are the same, and
-the "pattern" URL does not care about the path component at all. However, this
-context would not match:
+then we will match: both protocols are the same and both hosts are the same.
+However, this context would not match:
 
 --------------------------------------
 [credential "https://kernel.org"]
@@ -166,11 +165,12 @@ match: Git compares the protocols exactly.  However, you may use wildcards in
 the domain name and other pattern matching techniques as with the `http.<URL>.*`
 options.
 
-If the "pattern" URL does include a path component, then this too must match
-exactly: the context `https://example.com/bar/baz.git` will match a config
-entry for `https://example.com/bar/baz.git` (in addition to matching the config
-entry for `https://example.com`) but will not match a config entry for
-`https://example.com/bar`.
+If the "pattern" URL does include a path component, then this must match
+as a path prefix: the context `https://example.com/bar` will match a config
+entry for `https://example.com/bar/baz.git` but will not match a config entry for
+`https://example.com/other/repo.git` or `https://example.com/barry/repo.git`
+(even though it is a string prefix). To match as a prefix, the pattern
+must include protocol and host.
 
 
 CONFIGURATION OPTIONS
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index cb3a85c7ff..07aa834d33 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -991,18 +991,24 @@ test_expect_success 'url parser not confused by encoded markers' '
 
 test_expect_success 'credential config with partial URLs' '
 	echo "echo password=yep" | write_script git-credential-yep &&
-	test_write_lines url=https://user@example.com/repo.git >stdin &&
+	test_write_lines url=https://user@example.com/org/repo.git >stdin &&
 	for partial in \
 		example.com \
+		example.com/org/repo.git \
 		user@example.com \
+		user@example.com/org/repo.git \
 		https:// \
 		https://example.com \
 		https://example.com/ \
+		https://example.com/org \
+		https://example.com/org/ \
+		https://example.com/org/repo.git \
 		https://user@example.com \
 		https://user@example.com/ \
-		https://example.com/repo.git \
-		https://user@example.com/repo.git \
-		/repo.git
+		https://user@example.com/org \
+		https://user@example.com/org/ \
+		https://user@example.com/org/repo.git \
+		/org/repo.git
 	do
 		git -c credential.$partial.helper=yep \
 			credential fill <stdin >stdout &&
@@ -1012,7 +1018,12 @@ test_expect_success 'credential config with partial URLs' '
 
 	for partial in \
 		dont.use.this \
+		example.com/o \
+		user@example.com/o \
 		http:// \
+		https://example.com/o \
+		https://user@example.com/o \
+		/o \
 		/repo
 	do
 		git -c credential.$partial.helper=yep \

base-commit: 821f583da6d30a84249f75f33501504d597bc16b
-- 
gitgitgadget

```

## Junio C Hamano, 2025-10-03 21:24

Subject: Re: [PATCH v2] docs/gitcredentials: describe URL prefix matching
Message-ID: <xmqqwm5bsmpz.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqwm5bsmpz.fsf%40gitster.g
In-Reply-To: <pull.1979.v2.git.1759525133638.gitgitgadget@gmail.com>

```
"M Hickford via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: M Hickford <mirth.hickford@gmail.com>
>
> Documentation was inaccurate since 9a121b0d226 (credential: handle
> `credential.<partial-URL>.<key>` again, 2020-04-24)
>
> Add tests for documented behaviour.
>
> Signed-off-by: M Hickford <mirth.hickford@gmail.com>
> ---
>     docs/gitcredentials: describe URL prefix matching

Hmph, v1 was merged to 'next' already yesterday, so a replacement
patch is not what I was expecting to see.  Can you make an
incremental update instead?

Thanks.

```
