Merge git://git.bogomips.org/git-svn

* git://git.bogomips.org/git-svn:
  git-svn: Warn about changing default for --prefix in Git v2.0
  Documentation/git-svn: Promote the use of --prefix in docs + examples
  git-svn.txt: elaborate on rev_map files
  git-svn.txt: replace .git with $GIT_DIR
  git-svn.txt: reword description of gc command
  git-svn.txt: fix AsciiDoc formatting error
  git-svn: fix signed commit parsing
This commit is contained in:
Junio C Hamano 2013-10-16 10:45:58 -07:00
commit 1668b7d78f
3 changed files with 146 additions and 25 deletions

View File

@ -79,8 +79,21 @@ COMMANDS
trailing slash, so be sure you include one in the trailing slash, so be sure you include one in the
argument if that is what you want. If --branches/-b is argument if that is what you want. If --branches/-b is
specified, the prefix must include a trailing slash. specified, the prefix must include a trailing slash.
Setting a prefix is useful if you wish to track multiple Setting a prefix (with a trailing slash) is strongly
projects that share a common repository. encouraged in any case, as your SVN-tracking refs will
then be located at "refs/remotes/$prefix/*", which is
compatible with Git's own remote-tracking ref layout
(refs/remotes/$remote/*). Setting a prefix is also useful
if you wish to track multiple projects that share a common
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
@ -104,8 +117,11 @@ COMMANDS
'fetch':: 'fetch'::
Fetch unfetched revisions from the Subversion remote we are Fetch unfetched revisions from the Subversion remote we are
tracking. The name of the [svn-remote "..."] section in the tracking. The name of the [svn-remote "..."] section in the
.git/config file may be specified as an optional command-line $GIT_DIR/config file may be specified as an optional
argument. command-line argument.
+
This automatically updates the rev_map if needed (see
'$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details).
--localtime;; --localtime;;
Store Git commit times in the local timezone instead of UTC. This Store Git commit times in the local timezone instead of UTC. This
@ -201,6 +217,9 @@ accept. However, '--fetch-all' only fetches from the current
+ +
Like 'git rebase'; this requires that the working tree be clean Like 'git rebase'; this requires that the working tree be clean
and have no uncommitted changes. and have no uncommitted changes.
+
This automatically updates the rev_map if needed (see
'$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details).
-l;; -l;;
--local;; --local;;
@ -435,8 +454,8 @@ Any other arguments are passed directly to 'git log'
specific revision. specific revision.
'gc':: 'gc'::
Compress $GIT_DIR/svn/<refname>/unhandled.log files in .git/svn Compress $GIT_DIR/svn/<refname>/unhandled.log files and remove
and remove $GIT_DIR/svn/<refname>index files in .git/svn. $GIT_DIR/svn/<refname>/index files.
'reset':: 'reset'::
Undoes the effects of 'fetch' back to the specified revision. Undoes the effects of 'fetch' back to the specified revision.
@ -449,9 +468,10 @@ Any other arguments are passed directly to 'git log'
file cannot be ignored forever (with --ignore-paths) the only file cannot be ignored forever (with --ignore-paths) the only
way to repair the repo is to use 'reset'. way to repair the repo is to use 'reset'.
+ +
Only the rev_map and refs/remotes/git-svn are changed. Follow 'reset' Only the rev_map and refs/remotes/git-svn are changed (see
with a 'fetch' and then 'git reset' or 'git rebase' to move local '$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details).
branches onto the new tree. Follow 'reset' with a 'fetch' and then 'git reset' or 'git rebase' to
move local branches onto the new tree.
-r <n>;; -r <n>;;
--revision=<n>;; --revision=<n>;;
@ -684,7 +704,7 @@ svn-remote.<name>.noMetadata::
+ +
This option can only be used for one-shot imports as 'git svn' This option can only be used for one-shot imports as 'git svn'
will not be able to fetch again without metadata. Additionally, will not be able to fetch again without metadata. Additionally,
if you lose your .git/svn/**/.rev_map.* files, 'git svn' will not if you lose your '$GIT_DIR/svn/\*\*/.rev_map.*' files, 'git svn' will not
be able to rebuild them. be able to rebuild them.
+ +
The 'git svn log' command will not work on repositories using The 'git svn log' command will not work on repositories using
@ -804,16 +824,16 @@ Tracking and contributing to an entire Subversion-managed project
------------------------------------------------------------------------ ------------------------------------------------------------------------
# Clone a repo with standard SVN directory layout (like git clone): # Clone a repo with standard SVN directory layout (like git clone):
git svn clone http://svn.example.com/project --stdlayout git svn clone http://svn.example.com/project --stdlayout --prefix svn/
# Or, if the repo uses a non-standard directory layout: # Or, if the repo uses a non-standard directory layout:
git svn clone http://svn.example.com/project -T tr -b branch -t tag git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
# View all branches and tags you have cloned: # View all branches and tags you have cloned:
git branch -r git branch -r
# Create a new branch in SVN # Create a new branch in SVN
git svn branch waldo git svn branch waldo
# Reset your master to trunk (or any other branch, replacing 'trunk' # Reset your master to trunk (or any other branch, replacing 'trunk'
# with the appropriate name): # with the appropriate name):
git reset --hard remotes/trunk git reset --hard svn/trunk
# You may only dcommit to one branch/tag/trunk at a time. The usage # You may only dcommit to one branch/tag/trunk at a time. The usage
# of dcommit/rebase/show-ignore should be the same as above. # of dcommit/rebase/show-ignore should be the same as above.
------------------------------------------------------------------------ ------------------------------------------------------------------------
@ -827,7 +847,7 @@ have each person clone that repository with 'git clone':
------------------------------------------------------------------------ ------------------------------------------------------------------------
# Do the initial import on a server # Do the initial import on a server
ssh server "cd /pub && git svn clone http://svn.example.com/project ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
# Clone locally - make sure the refs/remotes/ space matches the server # Clone locally - make sure the refs/remotes/ space matches the server
mkdir project mkdir project
cd project cd project
@ -840,8 +860,9 @@ have each person clone that repository with 'git clone':
git config --remove-section remote.origin git config --remove-section remote.origin
# Create a local branch from one of the branches just fetched # Create a local branch from one of the branches just fetched
git checkout -b master FETCH_HEAD git checkout -b master FETCH_HEAD
# Initialize 'git svn' locally (be sure to use the same URL and -T/-b/-t options as were used on server) # Initialize 'git svn' locally (be sure to use the same URL and
git svn init http://svn.example.com/project # --stdlayout/-T/-b/-t/--prefix options as were used on server)
git svn init http://svn.example.com/project [options...]
# Pull the latest changes from Subversion # Pull the latest changes from Subversion
git svn rebase git svn rebase
------------------------------------------------------------------------ ------------------------------------------------------------------------
@ -973,12 +994,22 @@ without giving any repository layout options. If the full history with
branches and tags is required, the options '--trunk' / '--branches' / branches and tags is required, the options '--trunk' / '--branches' /
'--tags' must be used. '--tags' must be used.
When using the options for describing the repository layout (--trunk,
--tags, --branches, --stdlayout), please also specify the --prefix
option (e.g. '--prefix=origin/') to cause your SVN-tracking refs to be
placed at refs/remotes/origin/* rather than the default refs/remotes/*.
The former is more compatible with the layout of Git's "regular"
remote-tracking refs (refs/remotes/$remote/*), and may potentially
prevent similarly named SVN branches and Git remotes from clobbering
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
the same name, or if a branch and a tag have the same name). In these cases, the same name, or if a branch and a tag have the same name). In these cases,
use 'init' to set up your Git repository then, before your first 'fetch', edit use 'init' to set up your Git repository then, before your first 'fetch', edit
the .git/config file so that the branches and tags are associated with the $GIT_DIR/config file so that the branches and tags are associated
different name spaces. For example: with different name spaces. For example:
branches = stable/*:refs/remotes/svn/stable/* branches = stable/*:refs/remotes/svn/stable/*
branches = debug/*:refs/remotes/svn/debug/* branches = debug/*:refs/remotes/svn/debug/*
@ -1006,7 +1037,7 @@ CONFIGURATION
------------- -------------
'git svn' stores [svn-remote] configuration information in the 'git svn' stores [svn-remote] configuration information in the
repository .git/config file. It is similar the core Git repository $GIT_DIR/config file. It is similar the core Git
[remote] sections except 'fetch' keys do not accept glob [remote] sections except 'fetch' keys do not accept glob
arguments; but they are instead handled by the 'branches' arguments; but they are instead handled by the 'branches'
and 'tags' keys. Since some SVN repositories are oddly and 'tags' keys. Since some SVN repositories are oddly
@ -1035,8 +1066,8 @@ comma-separated list of names within braces. For example:
[svn-remote "huge-project"] [svn-remote "huge-project"]
url = http://server.org/svn url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/* branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/* tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*
------------------------------------------------------------------------ ------------------------------------------------------------------------
Multiple fetch, branches, and tags keys are supported: Multiple fetch, branches, and tags keys are supported:
@ -1060,8 +1091,21 @@ $ git svn branch -d branches/server release-2-3-0
Note that git-svn keeps track of the highest revision in which a branch Note that git-svn keeps track of the highest revision in which a branch
or tag has appeared. If the subset of branches or tags is changed after or tag has appeared. If the subset of branches or tags is changed after
fetching, then .git/svn/.metadata must be manually edited to remove (or fetching, then $GIT_DIR/svn/.metadata must be manually edited to remove
reset) branches-maxRev and/or tags-maxRev as appropriate. (or reset) branches-maxRev and/or tags-maxRev as appropriate.
FILES
-----
$GIT_DIR/svn/\*\*/.rev_map.*::
Mapping between Subversion revision numbers and Git commit
names. In a repository where the noMetadata option is not set,
this can be rebuilt from the git-svn-id: lines that are at the
end of every commit (see the 'svn.noMetadata' section above for
details).
+
'git svn fetch' and 'git svn rebase' automatically update the rev_map
if it is missing or not up to date. 'git svn reset' automatically
rewinds it.
SEE ALSO SEE ALSO
-------- --------

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(@_);
@ -1759,7 +1769,7 @@ sub get_commit_entry {
my $msgbuf = ""; my $msgbuf = "";
while (<$msg_fh>) { while (<$msg_fh>) {
if (!$in_msg) { if (!$in_msg) {
$in_msg = 1 if (/^\s*$/); $in_msg = 1 if (/^$/);
$author = $1 if (/^author (.*>)/); $author = $1 if (/^author (.*>)/);
} elsif (/^git-svn-id: /) { } elsif (/^git-svn-id: /) {
# skip this for now, we regenerate the # skip this for now, we regenerate the

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