# [PATCH] remote add: add a --no-tags (-n) option

7 messages from 2010-04-19 to 2010-04-19. Participants: Samuel Tardieu, Michael J Gruber, Junio C Hamano.
Thread: https://gitlist.dev/t/23526

## Samuel Tardieu, 2010-04-19 13:50

Subject: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <20100419135014.1077.28627.stgit@localhost.localdomain>
URL: https://gitlist.dev/e/20100419135014.1077.28627.stgit%40localhost.localdomain

```
Add a '--no-tags' option to 'git remote add' which adds a
'remote.REMOTE.tagopt = --no-tags' to the configuration file.

'git add -f -n REMOTE' will create a new remote and fetch from it
without importing the tags. Subsequent 'git fetch REMOTE' will also
not import the tags.

Signed-off-by: Samuel Tardieu <sam@rfc1149.net>
---
 Documentation/git-remote.txt |    5 ++++-
 builtin/remote.c             |   11 ++++++++++-
 t/t5505-remote.sh            |   36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 3fc599c..9db3c35 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -10,7 +10,7 @@ SYNOPSIS
 --------
 [verse]
 'git remote' [-v | --verbose]
-'git remote add' [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>
+'git remote add' [-t <branch>] [-m <master>] [-f] [-n] [--mirror] <name> <url>
 'git remote rename' <old> <new>
 'git remote rm' <name>
 'git remote set-head' <name> (-a | -d | <branch>)
@@ -51,6 +51,9 @@ update remote-tracking branches <name>/<branch>.
 With `-f` option, `git fetch <name>` is run immediately after
 the remote information is set up.
 +
+With `-n` option, `git fetch <name>` does not import tags from
+the remote repository.
++
 With `-t <branch>` option, instead of the default glob
 refspec for the remote to track all branches under
 `$GIT_DIR/remotes/<name>/`, a refspec to track only `<branch>`
diff --git a/builtin/remote.c b/builtin/remote.c
index 277765b..bb5606b 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -106,7 +106,7 @@ static int fetch_remote(const char *name)
 
 static int add(int argc, const char **argv)
 {
-	int fetch = 0, mirror = 0;
+	int fetch = 0, mirror = 0, notags = 0;
 	struct string_list track = { NULL, 0, 0 };
 	const char *master = NULL;
 	struct remote *remote;
@@ -116,6 +116,8 @@ static int add(int argc, const char **argv)
 
 	struct option options[] = {
 		OPT_BOOLEAN('f', "fetch", &fetch, "fetch the remote branches"),
+		OPT_BOOLEAN('n', "no-tags", &notags,
+			"do not import remote tags when fetching"),
 		OPT_CALLBACK('t', "track", &track, "branch",
 			"branch(es) to track", opt_parse_track),
 		OPT_STRING('m', "master", &master, "branch", "master branch"),
@@ -172,6 +174,13 @@ static int add(int argc, const char **argv)
 			return 1;
 	}
 
+	if (notags) {
+		strbuf_reset(&buf);
+		strbuf_addf(&buf, "remote.%s.tagopt", name);
+		if (git_config_set(buf.buf, "--no-tags"))
+			return 1;
+	}
+
 	if (fetch && fetch_remote(name))
 		return 1;
 
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 230c0cd..d4ed7ea 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -320,6 +320,42 @@ test_expect_success 'add alt && prune' '
 	 git rev-parse --verify refs/remotes/origin/side2)
 '
 
+cat > test/expect << EOF
+some-tag
+EOF
+
+test_expect_success 'add with tags (default)' '
+	(cd one &&
+	 git tag -a -m "Some tag" some-tag) &&
+	(mkdir add-tags &&
+	 cd add-tags &&
+	 git init &&
+	 git remote add -f origin ../one &&
+	 git tag -l some-tag > ../test/output &&
+	 test_must_fail git config remote.origin.tagopt) &&
+	(cd one &&
+	 git tag -d some-tag) &&
+	test_cmp test/expect test/output
+'
+
+cat > test/expect << EOF
+--no-tags
+EOF
+
+test_expect_success 'add --no-tags' '
+	(cd one &&
+	 git tag -a -m "Some tag" some-tag) &&
+	(mkdir add-no-tags &&
+	 cd add-no-tags &&
+	 git init &&
+	 git remote add -f -n origin ../one &&
+	 git tag -l some-tag > ../test/output &&
+	 git config remote.origin.tagopt >> ../test/output) &&
+	(cd one &&
+	 git tag -d some-tag) &&
+	test_cmp test/expect test/output
+'
+
 cat > one/expect << EOF
   apis/master
   apis/side

```

## Michael J Gruber, 2010-04-19 16:10

Subject: Re: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <4BCC8073.80109@drmicha.warpmail.net>
URL: https://gitlist.dev/e/4BCC8073.80109%40drmicha.warpmail.net
In-Reply-To: <20100419135014.1077.28627.stgit@localhost.localdomain>

```
Samuel Tardieu venit, vidit, dixit 19.04.2010 15:50:
> Add a '--no-tags' option to 'git remote add' which adds a
> 'remote.REMOTE.tagopt = --no-tags' to the configuration file.
> 
> 'git add -f -n REMOTE' will create a new remote and fetch from it

I guess you mean 'git remote add' here.

The general directions for this is nice. Just don't expect much response
now in rc-phase.

> without importing the tags. Subsequent 'git fetch REMOTE' will also
> not import the tags.
> 
> Signed-off-by: Samuel Tardieu <sam@rfc1149.net>
> ---
>  Documentation/git-remote.txt |    5 ++++-
>  builtin/remote.c             |   11 ++++++++++-
>  t/t5505-remote.sh            |   36 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 50 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
> index 3fc599c..9db3c35 100644
> --- a/Documentation/git-remote.txt
> +++ b/Documentation/git-remote.txt
> @@ -10,7 +10,7 @@ SYNOPSIS
>  --------
>  [verse]
>  'git remote' [-v | --verbose]
> -'git remote add' [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>
> +'git remote add' [-t <branch>] [-m <master>] [-f] [-n] [--mirror] <name> <url>
>  'git remote rename' <old> <new>
>  'git remote rm' <name>
>  'git remote set-head' <name> (-a | -d | <branch>)
> @@ -51,6 +51,9 @@ update remote-tracking branches <name>/<branch>.
>  With `-f` option, `git fetch <name>` is run immediately after
>  the remote information is set up.
>  +
> +With `-n` option, `git fetch <name>` does not import tags from
> +the remote repository.
> ++
>  With `-t <branch>` option, instead of the default glob
>  refspec for the remote to track all branches under
>  `$GIT_DIR/remotes/<name>/`, a refspec to track only `<branch>`
> diff --git a/builtin/remote.c b/builtin/remote.c
> index 277765b..bb5606b 100644
> --- a/builtin/remote.c
> +++ b/builtin/remote.c
> @@ -106,7 +106,7 @@ static int fetch_remote(const char *name)
>  
>  static int add(int argc, const char **argv)
>  {
> -	int fetch = 0, mirror = 0;
> +	int fetch = 0, mirror = 0, notags = 0;
>  	struct string_list track = { NULL, 0, 0 };
>  	const char *master = NULL;
>  	struct remote *remote;
> @@ -116,6 +116,8 @@ static int add(int argc, const char **argv)
>  
>  	struct option options[] = {
>  		OPT_BOOLEAN('f', "fetch", &fetch, "fetch the remote branches"),
> +		OPT_BOOLEAN('n', "no-tags", &notags,
> +			"do not import remote tags when fetching"),
>  		OPT_CALLBACK('t', "track", &track, "branch",
>  			"branch(es) to track", opt_parse_track),
>  		OPT_STRING('m', "master", &master, "branch", "master branch"),
> @@ -172,6 +174,13 @@ static int add(int argc, const char **argv)
>  			return 1;
>  	}
>  
> +	if (notags) {
> +		strbuf_reset(&buf);
> +		strbuf_addf(&buf, "remote.%s.tagopt", name);
> +		if (git_config_set(buf.buf, "--no-tags"))
> +			return 1;

Is this buf freed again?

> +	}
> +
>  	if (fetch && fetch_remote(name))
>  		return 1;
>  
> diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
> index 230c0cd..d4ed7ea 100755
> --- a/t/t5505-remote.sh
> +++ b/t/t5505-remote.sh
> @@ -320,6 +320,42 @@ test_expect_success 'add alt && prune' '
>  	 git rev-parse --verify refs/remotes/origin/side2)
>  '
>  
> +cat > test/expect << EOF
> +some-tag
> +EOF
> +
> +test_expect_success 'add with tags (default)' '
> +	(cd one &&
> +	 git tag -a -m "Some tag" some-tag) &&
> +	(mkdir add-tags &&
> +	 cd add-tags &&
> +	 git init &&
> +	 git remote add -f origin ../one &&
> +	 git tag -l some-tag > ../test/output &&
> +	 test_must_fail git config remote.origin.tagopt) &&
> +	(cd one &&
> +	 git tag -d some-tag) &&
> +	test_cmp test/expect test/output
> +'
> +
> +cat > test/expect << EOF
> +--no-tags
> +EOF
> +
> +test_expect_success 'add --no-tags' '
> +	(cd one &&
> +	 git tag -a -m "Some tag" some-tag) &&
> +	(mkdir add-no-tags &&
> +	 cd add-no-tags &&
> +	 git init &&
> +	 git remote add -f -n origin ../one &&
> +	 git tag -l some-tag > ../test/output &&
> +	 git config remote.origin.tagopt >> ../test/output) &&
> +	(cd one &&
> +	 git tag -d some-tag) &&
> +	test_cmp test/expect test/output
> +'
> +
>  cat > one/expect << EOF
>    apis/master
>    apis/side
> 

```

## Samuel Tardieu, 2010-04-19 16:19

Subject: Re: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <2010-04-19-18-19-15+trackit+sam@rfc1149.net>
URL: https://gitlist.dev/e/2010-04-19-18-19-15%2Btrackit%2Bsam%40rfc1149.net
In-Reply-To: <4BCC8073.80109@drmicha.warpmail.net>

```
>>>>> "Michael" == Michael J Gruber <git@drmicha.warpmail.net> writes:

Michael> Samuel Tardieu venit, vidit, dixit 19.04.2010 15:50:
>> Add a '--no-tags' option to 'git remote add' which adds a
>> 'remote.REMOTE.tagopt = --no-tags' to the configuration file.
>> 
>> 'git add -f -n REMOTE' will create a new remote and fetch from it

Michael> I guess you mean 'git remote add' here.

Yes, indeed.

Michael> Is this buf freed again?

Absolutely, there is a "strbuf_release(&buf)" a few lines down (the
buffer may be reused in the meantime).

  Sam
-- 
Samuel Tardieu -- sam@rfc1149.net -- http://www.rfc1149.net/

```

## Junio C Hamano, 2010-04-19 18:13

Subject: Re: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <7vvdbnqpis.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vvdbnqpis.fsf%40alter.siamese.dyndns.org
In-Reply-To: <20100419135014.1077.28627.stgit@localhost.localdomain>

```
Samuel Tardieu <sam@rfc1149.net> writes:

> @@ -116,6 +116,8 @@ static int add(int argc, const char **argv)
>  
>  	struct option options[] = {
>  		OPT_BOOLEAN('f', "fetch", &fetch, "fetch the remote branches"),
> +		OPT_BOOLEAN('n', "no-tags", &notags,
> +			"do not import remote tags when fetching"),

Any long-opt that begins with "no-" looks wrong, especially that will
allow people to say "--no-no-tags".  Perhaps something like this is
necessary.

    { OPTION_BOOLEAN, 0, "tags", &tags, NULL, "fetch tags", PARSE_OPT_NOARG }

Or imitate whatever we do in builtin-fetch.c; although I suspect the
default would be different in this command and "git fetch", so you may
need to adjust for the difference a bit.

```

## Samuel Tardieu, 2010-04-19 20:19

Subject: Re: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <2010-04-19-22-19-11+trackit+sam@rfc1149.net>
URL: https://gitlist.dev/e/2010-04-19-22-19-11%2Btrackit%2Bsam%40rfc1149.net
In-Reply-To: <7vvdbnqpis.fsf@alter.siamese.dyndns.org>

```
Add a '--no-tags' option to 'git remote add' which adds a
'remote.REMOTE.tagopt = --no-tags' to the configuration file.

'git remote add -f -n REMOTE' will create a new remote and fetch
from it without importing the tags. Subsequent 'git fetch REMOTE'
will also not import the tags.

Signed-off-by: Samuel Tardieu <sam@rfc1149.net>

---
 Documentation/git-remote.txt |    5 ++++-
 builtin/remote.c             |   12 +++++++++++-
 t/t5505-remote.sh            |   41 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+), 2 deletions(-)

>>>>> "Junio" == Junio C Hamano <gitster@pobox.com> writes:

Junio> Any long-opt that begins with "no-" looks wrong, especially that
Junio> will allow people to say "--no-no-tags".  Perhaps something like
Junio> this is necessary.

Junio>     { OPTION_BOOLEAN, 0, "tags", &tags, NULL, "fetch tags",
Junio> PARSE_OPT_NOARG }

In this version I've used "PARSE_OPT_NOARG | PARSE_OPT_NONEG" to forbid
"--no-no-tags" and added a test for it.

Junio> Or imitate whatever we do in builtin-fetch.c; although I suspect
Junio> the default would be different in this command and "git fetch",
Junio> so you may need to adjust for the difference a bit.

I don't think we need to add "--tags" to "git remote add", do you? If
you do, this is not difficult to add using the "git fetch" logic you
describe.

  Sam
-- 
Samuel Tardieu -- sam@rfc1149.net -- http://www.rfc1149.net/

diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 3fc599c..9db3c35 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -10,7 +10,7 @@ SYNOPSIS
 --------
 [verse]
 'git remote' [-v | --verbose]
-'git remote add' [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>
+'git remote add' [-t <branch>] [-m <master>] [-f] [-n] [--mirror] <name> <url>
 'git remote rename' <old> <new>
 'git remote rm' <name>
 'git remote set-head' <name> (-a | -d | <branch>)
@@ -51,6 +51,9 @@ update remote-tracking branches <name>/<branch>.
 With `-f` option, `git fetch <name>` is run immediately after
 the remote information is set up.
 +
+With `-n` option, `git fetch <name>` does not import tags from
+the remote repository.
++
 With `-t <branch>` option, instead of the default glob
 refspec for the remote to track all branches under
 `$GIT_DIR/remotes/<name>/`, a refspec to track only `<branch>`
diff --git a/builtin/remote.c b/builtin/remote.c
index 277765b..ff16487 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -106,7 +106,7 @@ static int fetch_remote(const char *name)
 
 static int add(int argc, const char **argv)
 {
-	int fetch = 0, mirror = 0;
+	int fetch = 0, mirror = 0, notags = 0;
 	struct string_list track = { NULL, 0, 0 };
 	const char *master = NULL;
 	struct remote *remote;
@@ -116,6 +116,9 @@ static int add(int argc, const char **argv)
 
 	struct option options[] = {
 		OPT_BOOLEAN('f', "fetch", &fetch, "fetch the remote branches"),
+		{ OPTION_BOOLEAN, 'n', "no-tags", &notags, NULL,
+		  "do not import remote tags when fetching",
+		  PARSE_OPT_NOARG | PARSE_OPT_NONEG },
 		OPT_CALLBACK('t', "track", &track, "branch",
 			"branch(es) to track", opt_parse_track),
 		OPT_STRING('m', "master", &master, "branch", "master branch"),
@@ -172,6 +175,13 @@ static int add(int argc, const char **argv)
 			return 1;
 	}
 
+	if (notags) {
+		strbuf_reset(&buf);
+		strbuf_addf(&buf, "remote.%s.tagopt", name);
+		if (git_config_set(buf.buf, "--no-tags"))
+			return 1;
+	}
+
 	if (fetch && fetch_remote(name))
 		return 1;
 
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 230c0cd..47e9e67 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -320,6 +320,47 @@ test_expect_success 'add alt && prune' '
 	 git rev-parse --verify refs/remotes/origin/side2)
 '
 
+cat > test/expect << EOF
+some-tag
+EOF
+
+test_expect_success 'add with tags (default)' '
+	(cd one &&
+	 git tag -a -m "Some tag" some-tag) &&
+	(mkdir add-tags &&
+	 cd add-tags &&
+	 git init &&
+	 git remote add -f origin ../one &&
+	 git tag -l some-tag > ../test/output &&
+	 test_must_fail git config remote.origin.tagopt) &&
+	(cd one &&
+	 git tag -d some-tag) &&
+	test_cmp test/expect test/output
+'
+
+cat > test/expect << EOF
+--no-tags
+EOF
+
+test_expect_success 'add --no-tags' '
+	(cd one &&
+	 git tag -a -m "Some tag" some-tag) &&
+	(mkdir add-no-tags &&
+	 cd add-no-tags &&
+	 git init &&
+	 git remote add -f -n origin ../one &&
+	 git tag -l some-tag > ../test/output &&
+	 git config remote.origin.tagopt >> ../test/output) &&
+	(cd one &&
+	 git tag -d some-tag) &&
+	test_cmp test/expect test/output
+'
+
+test_expect_success 'reject --no-no-tags' '
+	(cd add-no-tags &&
+	 test_must_fail git remote add -f --no-no-tags neworigin ../one)
+'
+
 cat > one/expect << EOF
   apis/master
   apis/side
-- 
tg: (af02b6d..) t/no-tags (depends on: origin/next)

```

## Junio C Hamano, 2010-04-19 21:52

Subject: Re: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <7vr5mbp0tt.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vr5mbp0tt.fsf%40alter.siamese.dyndns.org
In-Reply-To: <2010-04-19-22-19-11+trackit+sam@rfc1149.net>

```
Samuel Tardieu <sam@rfc1149.net> writes:

> I don't think we need to add "--tags" to "git remote add", do you? If
> you do, this is not difficult to add using the "git fetch" logic you
> describe.

I actually do suspect that would make the interface more consistent.

```

## Samuel Tardieu, 2010-04-19 23:34

Subject: Re: [PATCH] remote add: add a --no-tags (-n) option
Message-ID: <2010-04-20-01-34-38+trackit+sam@rfc1149.net>
URL: https://gitlist.dev/e/2010-04-20-01-34-38%2Btrackit%2Bsam%40rfc1149.net
In-Reply-To: <7vr5mbp0tt.fsf@alter.siamese.dyndns.org>

```
>>>>> "Junio" == Junio C Hamano <gitster@pobox.com> writes:

Junio> Samuel Tardieu <sam@rfc1149.net> writes:
>> I don't think we need to add "--tags" to "git remote add", do you? If
>> you do, this is not difficult to add using the "git fetch" logic you
>> describe.

Junio> I actually do suspect that would make the interface more
Junio> consistent.

Ok, sent as a v3 serie.

  Sam
-- 
Samuel Tardieu -- sam@rfc1149.net -- http://www.rfc1149.net/

```
