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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.