svn2git 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog.markdown +10 -0
- data/README.markdown +14 -1
- data/VERSION.yml +2 -2
- data/lib/svn2git/migration.rb +61 -17
- data/svn2git.gemspec +15 -18
- metadata +8 -9
- data/.gitignore +0 -2
data/ChangeLog.markdown
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# 2.1.0 - 2011-04-03
|
2
|
+
|
3
|
+
Thanks to Francois Rey (fmjrey), Sven Axelsson (svenax), and Julian Taylor (juliantaylor) for submitting all the patches
|
4
|
+
that comprise this release. svn2git now works with a much wider array SVN repositories because of their efforts.
|
5
|
+
|
6
|
+
* Added --no-minimize-url option for migrating specific subprojects from an SVN repo containing several projects (thanks fmjrey).
|
7
|
+
* Added --username option for migrating password-protected repositories (thanks svenax).
|
8
|
+
* Added --revision option for specifying the revision to start importing from (thanks svenax).
|
9
|
+
* Fixed compatibility with older versions of git (thanks juliantaylor).
|
10
|
+
|
1
11
|
# 2.0.0 - 2010-05-29
|
2
12
|
|
3
13
|
This release adds the oft requested incremental SVN update support. If you run svn2git with the `--rebase` option on an existing
|
data/README.markdown
CHANGED
@@ -107,6 +107,19 @@ doc directory and the backup files you once accidently added.
|
|
107
107
|
|
108
108
|
$ svn2git http://svn.example.com/path/to/repo --exclude doc --exclude '.*~$'
|
109
109
|
|
110
|
+
6. The svn repo actually tracks several projects and you only want to migrate
|
111
|
+
one of them.
|
112
|
+
|
113
|
+
$ svn2git http://svn.example.com/path/to/repo/nested_project --no-minimize-url
|
114
|
+
|
115
|
+
7. The svn repo is password protected.
|
116
|
+
|
117
|
+
$ svn2git http://svn.example.com/path/to/repo --username <<user_with_perms>>
|
118
|
+
|
119
|
+
8. You need to migrate starting at a specific svn revision number.
|
120
|
+
|
121
|
+
$ svn2git http://svn.example.com/path/to/repo --revision <<starting_revision_number>>
|
122
|
+
|
110
123
|
The above will create a git repository in the current directory with the git
|
111
124
|
version of the svn repository. Hence, you need to make a directory that you
|
112
125
|
want your new git repo to exist in, change into it and then run one of the
|
@@ -153,7 +166,7 @@ repository which name on its own line. This would allow you to easily
|
|
153
166
|
redirect the output of this command sequence to ~/.svn2git/authors and have
|
154
167
|
a very good starting point for your mapping.
|
155
168
|
|
156
|
-
$ svn log | grep -E "r[0-9]+ \|
|
169
|
+
$ svn log | grep -E "r[0-9]+ \| .+ \|" | awk '{print $3}' | sort | uniq
|
157
170
|
|
158
171
|
Debugging
|
159
172
|
---------
|
data/VERSION.yml
CHANGED
data/lib/svn2git/migration.rb
CHANGED
@@ -36,11 +36,15 @@ module Svn2Git
|
|
36
36
|
# Set up reasonable defaults for options.
|
37
37
|
options = {}
|
38
38
|
options[:verbose] = false
|
39
|
+
options[:metadata] = false
|
40
|
+
options[:nominimizeurl] = false
|
39
41
|
options[:rootistrunk] = false
|
40
42
|
options[:trunk] = 'trunk'
|
41
43
|
options[:branches] = 'branches'
|
42
44
|
options[:tags] = 'tags'
|
43
45
|
options[:exclude] = []
|
46
|
+
options[:revision] = nil
|
47
|
+
options[:username] = nil
|
44
48
|
|
45
49
|
if File.exists?(File.expand_path(DEFAULT_AUTHORS_FILE))
|
46
50
|
options[:authors] = DEFAULT_AUTHORS_FILE
|
@@ -58,6 +62,10 @@ module Svn2Git
|
|
58
62
|
options[:rebase] = true
|
59
63
|
end
|
60
64
|
|
65
|
+
opts.on('--username NAME', 'Username for transports that needs it (http(s), svn)') do |username|
|
66
|
+
options[:username] = username
|
67
|
+
end
|
68
|
+
|
61
69
|
opts.on('--trunk TRUNK_PATH', 'Subpath to trunk from repository URL (default: trunk)') do |trunk|
|
62
70
|
options[:trunk] = trunk
|
63
71
|
end
|
@@ -65,6 +73,7 @@ module Svn2Git
|
|
65
73
|
opts.on('--branches BRANCHES_PATH', 'Subpath to branches from repository URL (default: branches)') do |branches|
|
66
74
|
options[:branches] = branches
|
67
75
|
end
|
76
|
+
|
68
77
|
opts.on('--tags TAGS_PATH', 'Subpath to tags from repository URL (default: tags)') do |tags|
|
69
78
|
options[:tags] = tags
|
70
79
|
end
|
@@ -88,6 +97,18 @@ module Svn2Git
|
|
88
97
|
options[:tags] = nil
|
89
98
|
end
|
90
99
|
|
100
|
+
opts.on('--no-minimize-url', 'Accept URLs as-is without attempting to connect to a higher level directory') do
|
101
|
+
options[:nominimizeurl] = true
|
102
|
+
end
|
103
|
+
|
104
|
+
opts.on('--revision REV', 'Start importing from SVN revision') do |revision|
|
105
|
+
options[:revision] = revision
|
106
|
+
end
|
107
|
+
|
108
|
+
opts.on('-m', '--metadata', 'Include metadata in git logs (git-svn-id)') do
|
109
|
+
options[:metadata] = true
|
110
|
+
end
|
111
|
+
|
91
112
|
opts.on('--authors AUTHORS_FILE', "Path to file containing svn-to-git authors mapping (default: #{DEFAULT_AUTHORS_FILE})") do |authors|
|
92
113
|
options[:authors] = authors
|
93
114
|
end
|
@@ -120,18 +141,34 @@ module Svn2Git
|
|
120
141
|
trunk = @options[:trunk]
|
121
142
|
branches = @options[:branches]
|
122
143
|
tags = @options[:tags]
|
144
|
+
metadata = @options[:metadata]
|
145
|
+
nominimizeurl = @options[:nominimizeurl]
|
123
146
|
rootistrunk = @options[:rootistrunk]
|
124
147
|
authors = @options[:authors]
|
125
148
|
exclude = @options[:exclude]
|
149
|
+
revision = @options[:revision]
|
150
|
+
username = @options[:username]
|
126
151
|
|
127
152
|
if rootistrunk
|
128
153
|
# Non-standard repository layout. The repository root is effectively 'trunk.'
|
129
|
-
|
154
|
+
cmd = "git svn init --prefix=svn/ "
|
155
|
+
cmd += "--username=#{username} " unless username.nil?
|
156
|
+
cmd += "--no-metadata " unless metadata
|
157
|
+
if nominimizeurl
|
158
|
+
cmd += "--no-minimize-url "
|
159
|
+
end
|
160
|
+
cmd += "--trunk=#{@url}"
|
161
|
+
run_command(cmd)
|
130
162
|
|
131
163
|
else
|
132
|
-
cmd = "git svn init --
|
164
|
+
cmd = "git svn init --prefix=svn/ "
|
133
165
|
|
134
166
|
# Add each component to the command that was passed as an argument.
|
167
|
+
cmd += "--username=#{username} " unless username.nil?
|
168
|
+
cmd += "--no-metadata " unless metadata
|
169
|
+
if nominimizeurl
|
170
|
+
cmd += "--no-minimize-url "
|
171
|
+
end
|
135
172
|
cmd += "--trunk=#{trunk} " unless trunk.nil?
|
136
173
|
cmd += "--tags=#{tags} " unless tags.nil?
|
137
174
|
cmd += "--branches=#{branches} " unless branches.nil?
|
@@ -143,7 +180,8 @@ module Svn2Git
|
|
143
180
|
|
144
181
|
run_command("git config svn.authorsfile #{authors}") unless authors.nil?
|
145
182
|
|
146
|
-
cmd = "git svn fetch"
|
183
|
+
cmd = "git svn fetch "
|
184
|
+
cmd += "-r #{revision}:HEAD " unless revision.nil?
|
147
185
|
unless exclude.empty?
|
148
186
|
# Add exclude paths to the command line; some versions of git support
|
149
187
|
# this for fetch only, later also for init.
|
@@ -154,7 +192,7 @@ module Svn2Git
|
|
154
192
|
regex << "#{branches}[/][^/]+[/]" unless branches.nil?
|
155
193
|
end
|
156
194
|
regex = '^(?:' + regex.join('|') + ')(?:' + exclude.join('|') + ')'
|
157
|
-
cmd += "
|
195
|
+
cmd += "'--ignore-paths=#{regex}'"
|
158
196
|
end
|
159
197
|
run_command(cmd)
|
160
198
|
|
@@ -168,13 +206,13 @@ module Svn2Git
|
|
168
206
|
@remote = run_command("git branch -r --no-color").split(/\n/).collect{ |b| b.gsub(/\*/,'').strip }
|
169
207
|
|
170
208
|
# Tags are remote branches that start with "tags/".
|
171
|
-
@tags = @remote.find_all { |b| b.strip =~ %r{^tags\/} }
|
209
|
+
@tags = @remote.find_all { |b| b.strip =~ %r{^svn\/tags\/} }
|
172
210
|
end
|
173
211
|
|
174
212
|
def fix_tags
|
175
213
|
@tags.each do |tag|
|
176
214
|
tag = tag.strip
|
177
|
-
id = tag.gsub(%r{^tags\/}, '').strip
|
215
|
+
id = tag.gsub(%r{^svn\/tags\/}, '').strip
|
178
216
|
subject = run_command("git log -1 --pretty=format:'%s' #{tag}")
|
179
217
|
date = run_command("git log -1 --pretty=format:'%ci' #{tag}")
|
180
218
|
subject = escape_quotes(subject)
|
@@ -187,18 +225,24 @@ module Svn2Git
|
|
187
225
|
|
188
226
|
def fix_branches
|
189
227
|
svn_branches = @remote.find_all { |b| not @tags.include?(b) }
|
190
|
-
svn_branches.
|
191
|
-
branch = branch.strip
|
228
|
+
svn_branches = @remote.find_all { |b| b.strip =~ %r{^svn\/} }
|
192
229
|
|
230
|
+
if @options[:rebase]
|
231
|
+
run_command("git svn fetch")
|
232
|
+
end
|
233
|
+
|
234
|
+
svn_branches.each do |branch|
|
235
|
+
branch = branch.gsub(/^svn\//,'').strip
|
193
236
|
if @options[:rebase] && (@local.include?(branch) || branch == 'trunk')
|
194
|
-
|
195
|
-
|
196
|
-
run_command("git
|
237
|
+
lbranch = branch
|
238
|
+
lbranch = 'master' if branch == 'trunk'
|
239
|
+
run_command("git checkout -f #{lbranch}")
|
240
|
+
run_command("git rebase remotes/svn/#{branch}")
|
197
241
|
next
|
198
242
|
end
|
199
243
|
|
200
|
-
next if branch == 'trunk'
|
201
|
-
run_command("git branch
|
244
|
+
next if branch == 'trunk' || @local.include?(branch)
|
245
|
+
run_command("git branch --track #{branch} remotes/svn/#{branch}")
|
202
246
|
run_command("git checkout #{branch}")
|
203
247
|
end
|
204
248
|
end
|
@@ -206,7 +250,7 @@ module Svn2Git
|
|
206
250
|
def fix_trunk
|
207
251
|
trunk = @remote.find { |b| b.strip == 'trunk' }
|
208
252
|
if trunk && ! @options[:rebase]
|
209
|
-
run_command("git checkout trunk")
|
253
|
+
run_command("git checkout svn/trunk")
|
210
254
|
run_command("git branch -D master")
|
211
255
|
run_command("git checkout -f -b master")
|
212
256
|
else
|
@@ -229,7 +273,7 @@ module Svn2Git
|
|
229
273
|
ret << line
|
230
274
|
end
|
231
275
|
end
|
232
|
-
|
276
|
+
|
233
277
|
ret
|
234
278
|
end
|
235
279
|
|
@@ -242,12 +286,12 @@ module Svn2Git
|
|
242
286
|
puts @opts.help
|
243
287
|
exit
|
244
288
|
end
|
245
|
-
|
289
|
+
|
246
290
|
def verify_working_tree_is_clean
|
247
291
|
status = run_command('git status --porcelain --untracked-files=no')
|
248
292
|
unless status.strip == ''
|
249
293
|
puts 'You have local pending changes. The working tree must be clean in order to continue.'
|
250
|
-
exit
|
294
|
+
exit -1
|
251
295
|
end
|
252
296
|
end
|
253
297
|
|
data/svn2git.gemspec
CHANGED
@@ -1,43 +1,40 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{svn2git}
|
8
|
-
s.version = "2.
|
8
|
+
s.version = "2.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["James Coglan", "Kevin Menard"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-04-03}
|
13
13
|
s.default_executable = %q{svn2git}
|
14
14
|
s.email = %q{nirvdrum@gmail.com}
|
15
15
|
s.executables = ["svn2git"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"ChangeLog.markdown",
|
18
|
-
|
18
|
+
"README.markdown"
|
19
19
|
]
|
20
20
|
s.files = [
|
21
|
-
".
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
"svn2git.gemspec"
|
21
|
+
"ChangeLog.markdown",
|
22
|
+
"MIT-LICENSE",
|
23
|
+
"README.markdown",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION.yml",
|
26
|
+
"bin/svn2git",
|
27
|
+
"lib/svn2git.rb",
|
28
|
+
"lib/svn2git/blah.rb",
|
29
|
+
"lib/svn2git/migration.rb",
|
30
|
+
"svn2git.gemspec"
|
32
31
|
]
|
33
32
|
s.homepage = %q{https://www.negativetwenty.net/redmine/projects/svn2git}
|
34
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
35
33
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version = %q{1.3
|
34
|
+
s.rubygems_version = %q{1.5.3}
|
37
35
|
s.summary = %q{A tool for migrating svn projects to git}
|
38
36
|
|
39
37
|
if s.respond_to? :specification_version then
|
40
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
41
38
|
s.specification_version = 3
|
42
39
|
|
43
40
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svn2git
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 11
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 2.0.0
|
10
|
+
version: 2.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Coglan
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2011-04-03 00:00:00 -04:00
|
20
20
|
default_executable: svn2git
|
21
21
|
dependencies: []
|
22
22
|
|
@@ -30,7 +30,6 @@ extra_rdoc_files:
|
|
30
30
|
- ChangeLog.markdown
|
31
31
|
- README.markdown
|
32
32
|
files:
|
33
|
-
- .gitignore
|
34
33
|
- ChangeLog.markdown
|
35
34
|
- MIT-LICENSE
|
36
35
|
- README.markdown
|
@@ -46,8 +45,8 @@ homepage: https://www.negativetwenty.net/redmine/projects/svn2git
|
|
46
45
|
licenses: []
|
47
46
|
|
48
47
|
post_install_message:
|
49
|
-
rdoc_options:
|
50
|
-
|
48
|
+
rdoc_options: []
|
49
|
+
|
51
50
|
require_paths:
|
52
51
|
- lib
|
53
52
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -71,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
70
|
requirements: []
|
72
71
|
|
73
72
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.3
|
73
|
+
rubygems_version: 1.5.3
|
75
74
|
signing_key:
|
76
75
|
specification_version: 3
|
77
76
|
summary: A tool for migrating svn projects to git
|
data/.gitignore
DELETED