git-svn: Warn about changing default for --prefix in Git v2.0

In Git v2.0, we will change the default --prefix for init/clone from
none/empty to "origin/" (which causes SVN-tracking branches to be
placed at refs/remotes/origin/* instead of refs/remotes/*).

This patch warns users about the upcoming change, both in the git-svn
manual page, and on stderr when running init/clone in the "multi-mode"
without providing a --prefix.

Cc: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:
Johan Herland 2013-10-11 14:57:06 +02:00 committed by Eric Wong
parent 7091a2d0bf
commit f849bb6b3b
3 changed files with 88 additions and 2 deletions

View File

@ -86,6 +86,14 @@ COMMANDS
(refs/remotes/$remote/*). Setting a prefix is also useful (refs/remotes/$remote/*). Setting a prefix is also useful
if you wish to track multiple projects that share a common if you wish to track multiple projects that share a common
repository. repository.
+
NOTE: In Git v2.0, the default prefix will CHANGE from "" (no prefix)
to "origin/". This is done to put SVN-tracking refs at
"refs/remotes/origin/*" instead of "refs/remotes/*", and make them
more compatible with how Git's own remote-tracking refs are organized
(i.e. refs/remotes/$remote/*). You can enjoy the same benefits today,
by using the --prefix option.
--ignore-paths=<regex>;; --ignore-paths=<regex>;;
When passed to 'init' or 'clone' this regular expression will When passed to 'init' or 'clone' this regular expression will
be preserved as a config key. See 'fetch' for a description be preserved as a config key. See 'fetch' for a description
@ -993,7 +1001,8 @@ placed at refs/remotes/origin/* rather than the default refs/remotes/*.
The former is more compatible with the layout of Git's "regular" The former is more compatible with the layout of Git's "regular"
remote-tracking refs (refs/remotes/$remote/*), and may potentially remote-tracking refs (refs/remotes/$remote/*), and may potentially
prevent similarly named SVN branches and Git remotes from clobbering prevent similarly named SVN branches and Git remotes from clobbering
each other. each other. In Git v2.0 the default prefix used (i.e. when no --prefix
is given) will change from "" (no prefix) to "origin/".
When using multiple --branches or --tags, 'git svn' does not automatically When using multiple --branches or --tags, 'git svn' does not automatically
handle name collisions (for example, if two branches from different paths have handle name collisions (for example, if two branches from different paths have

View File

@ -1389,7 +1389,17 @@ sub cmd_multi_init {
usage(1); usage(1);
} }
$_prefix = '' unless defined $_prefix; unless (defined $_prefix) {
$_prefix = '';
warn <<EOF
WARNING: --prefix is not given, defaulting to empty prefix.
This is probably not what you want! In order to stay compatible
with regular remote-tracking refs, provide a prefix like
--prefix=origin/ (remember the trailing slash), which will cause
the SVN-tracking refs to be placed at refs/remotes/origin/*.
NOTE: In Git v2.0, the default prefix will change from empty to 'origin/'.
EOF
}
if (defined $url) { if (defined $url) {
$url = canonicalize_url($url); $url = canonicalize_url($url);
init_subdir(@_); init_subdir(@_);

View File

@ -52,4 +52,71 @@ test_expect_success 'clone to target directory with --stdlayout' '
rm -rf target rm -rf target
' '
test_expect_success 'init without -s/-T/-b/-t does not warn' '
test ! -d trunk &&
git svn init "$svnrepo"/project/trunk trunk 2>warning &&
test_must_fail grep -q prefix warning &&
rm -rf trunk &&
rm -f warning
'
test_expect_success 'clone without -s/-T/-b/-t does not warn' '
test ! -d trunk &&
git svn clone "$svnrepo"/project/trunk 2>warning &&
test_must_fail grep -q prefix warning &&
rm -rf trunk &&
rm -f warning
'
test_svn_configured_prefix () {
prefix=$1 &&
cat >expect <<EOF &&
project/trunk:refs/remotes/${prefix}trunk
project/branches/*:refs/remotes/${prefix}*
project/tags/*:refs/remotes/${prefix}tags/*
EOF
test ! -f actual &&
git --git-dir=project/.git config svn-remote.svn.fetch >>actual &&
git --git-dir=project/.git config svn-remote.svn.branches >>actual &&
git --git-dir=project/.git config svn-remote.svn.tags >>actual &&
test_cmp expect actual &&
rm -f expect actual
}
test_expect_success 'init with -s/-T/-b/-t without --prefix warns' '
test ! -d project &&
git svn init -s "$svnrepo"/project project 2>warning &&
grep -q prefix warning &&
test_svn_configured_prefix "" &&
rm -rf project &&
rm -f warning
'
test_expect_success 'clone with -s/-T/-b/-t without --prefix warns' '
test ! -d project &&
git svn clone -s "$svnrepo"/project 2>warning &&
grep -q prefix warning &&
test_svn_configured_prefix "" &&
rm -rf project &&
rm -f warning
'
test_expect_success 'init with -s/-T/-b/-t and --prefix does not warn' '
test ! -d project &&
git svn init -s "$svnrepo"/project project --prefix="" 2>warning &&
test_must_fail grep -q prefix warning &&
test_svn_configured_prefix "" &&
rm -rf project &&
rm -f warning
'
test_expect_success 'clone with -s/-T/-b/-t and --prefix does not warn' '
test ! -d project &&
git svn clone -s "$svnrepo"/project --prefix="" 2>warning &&
test_must_fail grep -q prefix warning &&
test_svn_configured_prefix "" &&
rm -rf project &&
rm -f warning
'
test_done test_done