From: Ralf Thielow <ralf.thielow@gmail.com>
To: gitster@pobox.com
Cc: pclouds@gmail.com, git@vger.kernel.org,
Ralf Thielow <ralf.thielow@gmail.com>
Subject: [PATCHv4] clone --single: limit the fetch refspec to fetched branch
Date: Sun, 16 Sep 2012 10:13:04 +0200 [thread overview]
Message-ID: <1347783184-20045-1-git-send-email-ralf.thielow@gmail.com> (raw)
In-Reply-To: <7vy5kc1avx.fsf@alter.siamese.dyndns.org>
After running "git clone --single", the resulting repository has the
usual default "+refs/heads/*:refs/remotes/origin/*" wildcard fetch
refspec installed, which means that a subsequent "git fetch" will
end up grabbing all the other branches.
Update the fetch refspec to cover only the singly cloned ref instead
to correct this.
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
---
Changes to v3:
- use commit message from Junio's topic branch
- add comment for the 'detached HEAD' case (also from Junio's topic branch)
(thanks for that)
- add tests for the refspec installed by the clone command
builtin/clone.c | 49 ++++++++++++++++++++++++++++------------
t/t5709-clone-refspec.sh | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
2 Dateien geändert, 94 Zeilen hinzugefügt(+), 14 Zeilen entfernt(-)
create mode 100755 t/t5709-clone-refspec.sh
diff --git a/builtin/clone.c b/builtin/clone.c
index 5e8f3ba..be4c62b 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -755,20 +755,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
}
strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf);
-
- if (option_mirror || !option_bare) {
- /* Configure the remote */
- strbuf_addf(&key, "remote.%s.fetch", option_origin);
- git_config_set_multivar(key.buf, value.buf, "^$", 0);
- strbuf_reset(&key);
-
- if (option_mirror) {
- strbuf_addf(&key, "remote.%s.mirror", option_origin);
- git_config_set(key.buf, "true");
- strbuf_reset(&key);
- }
- }
-
strbuf_addf(&key, "remote.%s.url", option_origin);
git_config_set(key.buf, repo);
strbuf_reset(&key);
@@ -853,6 +839,41 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
"refs/heads/master");
}
+ if (option_mirror || !option_bare) {
+ strbuf_reset(&value);
+ if (option_single_branch) {
+ if (option_branch)
+ strbuf_addf(&value, "+%s%s:%s%s",
+ src_ref_prefix, option_branch,
+ branch_top.buf, option_branch);
+ else if (remote_head_points_at)
+ strbuf_addf(&value, "+%s:%s%s",
+ remote_head_points_at->name, branch_top.buf,
+ skip_prefix(remote_head_points_at->name, "refs/heads/"));
+ /*
+ * otherwise, the next "git fetch" will
+ * simply fetch from HEAD without updating
+ * any remote tracking branch, which is what
+ * we want.
+ */
+ } else {
+ strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf);
+ }
+ /* Configure the remote */
+ if (value.len) {
+ strbuf_reset(&key);
+ strbuf_addf(&key, "remote.%s.fetch", option_origin);
+ git_config_set_multivar(key.buf, value.buf, "^$", 0);
+ strbuf_reset(&key);
+
+ if (option_mirror) {
+ strbuf_addf(&key, "remote.%s.mirror", option_origin);
+ git_config_set(key.buf, "true");
+ strbuf_reset(&key);
+ }
+ }
+ }
+
if (is_local)
clone_local(path, git_dir);
else if (refs && complete_refs_before_fetch)
diff --git a/t/t5709-clone-refspec.sh b/t/t5709-clone-refspec.sh
new file mode 100755
index 0000000..f4c8e31
--- /dev/null
+++ b/t/t5709-clone-refspec.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+test_description='test refspec written by clone-command'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ echo one >file &&
+ git add file &&
+ git commit -m one &&
+ echo two >file &&
+ git commit -a -m two &&
+ git tag two &&
+ echo three >file &&
+ git commit -a -m three &&
+ git checkout -b foo &&
+ echo four >file &&
+ git commit -a -m four &&
+ git checkout master
+'
+
+test_expect_success 'refspec contains all branches by default' '
+ git clone "file://$PWD" dir_all &&
+ echo "+refs/heads/*:refs/remotes/origin/*" > expected &&
+ git --git-dir=dir_all/.git config --get remote.origin.fetch > actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'refspec contains only master with option --single-branch and remotes HEAD point to master' '
+ git clone --single-branch "file://$PWD" dir_master &&
+ echo "+refs/heads/master:refs/remotes/origin/master" > expected &&
+ git --git-dir=dir_master/.git config --get remote.origin.fetch > actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'refspec contains only foo with option --single-branch and remotes HEAD point to foo' '
+ git checkout foo &&
+ git clone --single-branch "file://$PWD" dir_foo &&
+ echo "+refs/heads/foo:refs/remotes/origin/foo" > expected &&
+ git --git-dir=dir_foo/.git config --get remote.origin.fetch > actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'refspec contains one branch after using option --single-branch with --branch' '
+ git checkout master &&
+ git clone --single-branch --branch foo "file://$PWD" dir_foo2 &&
+ echo "+refs/heads/foo:refs/remotes/origin/foo" > expected &&
+ git --git-dir=dir_foo2/.git config --get remote.origin.fetch > actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'no refspec is written if remotes HEAD is detached' '
+ git checkout two^ &&
+ git clone --single-branch "file://$PWD" dir_detached &&
+ rm expected && touch expected &&
+ git --git-dir=dir_detached/.git config --get remote.origin.fetch > actual
+ test_cmp expected actual
+'
+
+test_done
--
1.7.12.396.g6bea32d.dirty
next prev parent reply other threads:[~2012-09-16 8:14 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-13 18:38 is this behaviour expected for "git clone --single-branch"? Ralf Thielow
2012-09-13 18:45 ` Junio C Hamano
2012-09-13 18:48 ` Ralf Thielow
2012-09-14 5:09 ` [PATCH] clone: fix refspec on "--single-branch" option Ralf Thielow
2012-09-14 5:35 ` Junio C Hamano
2012-09-14 6:48 ` Junio C Hamano
2012-09-14 13:10 ` Nguyen Thai Ngoc Duy
2012-09-14 14:25 ` Ralf Thielow
2012-09-14 16:02 ` Junio C Hamano
2012-09-14 18:11 ` [PATCHv2] " Ralf Thielow
2012-09-14 19:22 ` Junio C Hamano
2012-09-14 21:13 ` [PATCHv3] " Ralf Thielow
2012-09-14 22:45 ` Junio C Hamano
2012-09-16 8:13 ` Ralf Thielow [this message]
2012-09-17 4:48 ` [PATCHv4] clone --single: limit the fetch refspec to fetched branch Junio C Hamano
2012-09-17 12:06 ` Nguyen Thai Ngoc Duy
2012-09-17 12:11 ` Nguyen Thai Ngoc Duy
2012-09-17 19:21 ` [PATCHv5] " Ralf Thielow
2012-09-17 20:18 ` Junio C Hamano
2012-09-17 21:04 ` Ralf Thielow
2012-09-17 21:39 ` Junio C Hamano
2012-09-18 14:08 ` Ralf Thielow
2012-09-18 16:57 ` Junio C Hamano
2012-09-18 19:14 ` [PATCHv6] " Ralf Thielow
2012-09-18 19:42 ` Junio C Hamano
2012-09-18 19:45 ` Junio C Hamano
2012-09-19 16:45 ` [PATCHv7] " Ralf Thielow
2012-09-19 23:26 ` Junio C Hamano
2012-09-20 18:04 ` [PATCHv8] " Ralf Thielow
2012-09-20 21:17 ` Junio C Hamano
2012-09-19 7:36 ` [PATCHv6] " Nguyen Thai Ngoc Duy
2012-09-19 8:24 ` Ralf Thielow
2012-09-17 20:09 ` [PATCHv4] " Junio C Hamano
2012-09-18 1:04 ` Nguyen Thai Ngoc Duy
2012-09-18 3:56 ` Junio C Hamano
2012-09-17 13:25 ` Ralf Thielow
2012-09-17 20:08 ` Junio C Hamano
2012-09-18 1:02 ` Nguyen Thai Ngoc Duy
2012-09-14 18:42 ` [PATCH] clone: fix refspec on "--single-branch" option Junio C Hamano
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=1347783184-20045-1-git-send-email-ralf.thielow@gmail.com \
--to=ralf.thielow@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@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.
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).