summaryrefslogtreecommitdiff
path: root/Documentation/git-svn.txt
blob: 1812890a7e986b2632972390ea4646331c0c922b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
git-svn(1)
==========

NAME
----
git-svn - Bidirectional operation between a Subversion repository and git

SYNOPSIS
--------
'git svn' <command> [options] [arguments]

DESCRIPTION
-----------
'git svn' is a simple conduit for changesets between Subversion and git.
It provides a bidirectional flow of changes between a Subversion and a git
repository.

'git svn' can track a standard Subversion repository,
following the common "trunk/branches/tags" layout, with the --stdlayout option.
It can also follow branches and tags in any layout with the -T/-t/-b options
(see options to 'init' below, and also the 'clone' command).

Once tracking a Subversion repository (with any of the above methods), the git
repository can be updated from Subversion by the 'fetch' command and
Subversion updated from git by the 'dcommit' command.

COMMANDS
--------

'init'::
	Initializes an empty git repository with additional
	metadata directories for 'git svn'.  The Subversion URL
	may be specified as a command-line argument, or as full
	URL arguments to -T/-t/-b.  Optionally, the target
	directory to operate on can be specified as a second
	argument.  Normally this command initializes the current
	directory.

-T<trunk_subdir>;;
--trunk=<trunk_subdir>;;
-t<tags_subdir>;;
--tags=<tags_subdir>;;
-b<branches_subdir>;;
--branches=<branches_subdir>;;
-s;;
--stdlayout;;
	These are optional command-line options for init.  Each of
	these flags can point to a relative repository path
	(--tags=project/tags) or a full url
	(--tags=https://foo.org/project/tags).
	You can specify more than one --tags and/or --branches options, in case
	your Subversion repository places tags or branches under multiple paths.
	The option --stdlayout is
	a shorthand way of setting trunk,tags,branches as the relative paths,
	which is the Subversion default. If any of the other options are given
	as well, they take precedence.
--no-metadata;;
	Set the 'noMetadata' option in the [svn-remote] config.
--use-svm-props;;
	Set the 'useSvmProps' option in the [svn-remote] config.
--use-svnsync-props;;
	Set the 'useSvnsyncProps' option in the [svn-remote] config.
--rewrite-root=<URL>;;
	Set the 'rewriteRoot' option in the [svn-remote] config.
--username=<USER>;;
	For transports that SVN handles authentication for (http,
	https, and plain svn), specify the username.  For other
	transports (eg svn+ssh://), you must include the username in
	the URL, eg svn+ssh://foo@svn.bar.com/project
--prefix=<prefix>;;
	This allows one to specify a prefix which is prepended
	to the names of remotes if trunk/branches/tags are
	specified.  The prefix does not automatically include a
	trailing slash, so be sure you include one in the
	argument if that is what you want.  If --branches/-b is
	specified, the prefix must include a trailing slash.
	Setting a prefix is useful if you wish to track multiple
	projects that share a common repository.
--ignore-paths=<regex>;;
	When passed to 'init' or 'clone' this regular expression will
	be preserved as a config key.  See 'fetch' for a description
	of '--ignore-paths'.
--no-minimize-url;;
	When tracking multiple directories (using --stdlayout,
	--branches, or --tags options), git svn will attempt to connect
	to the root (or highest allowed level) of the Subversion
	repository.  This default allows better tracking of history if
	entire projects are moved within a repository, but may cause
	issues on repositories where read access restrictions are in
	place.  Passing '--no-minimize-url' will allow git svn to
	accept URLs as-is without attempting to connect to a higher
	level directory.  This option is off by default when only
	one URL/branch is tracked (it would do little good).

'fetch'::
	Fetch unfetched revisions from the Subversion remote we are
	tracking.  The name of the [svn-remote "..."] section in the
	.git/config file may be specified as an optional command-line
	argument.

--localtime;;
	Store Git commit times in the local timezone instead of UTC.  This
	makes 'git log' (even without --date=local) show the same times
	that `svn log` would in the local timezone.
+
This doesn't interfere with interoperating with the Subversion
repository you cloned from, but if you wish for your local Git
repository to be able to interoperate with someone else's local Git
repository, either don't use this option or you should both use it in
the same local timezone.

--parent;;
	Fetch only from the SVN parent of the current HEAD.

--ignore-paths=<regex>;;
	This allows one to specify a Perl regular expression that will
	cause skipping of all matching paths from checkout from SVN.
	The '--ignore-paths' option should match for every 'fetch'
	(including automatic fetches due to 'clone', 'dcommit',
	'rebase', etc) on a given repository.
+
[verse]
config key: svn-remote.<name>.ignore-paths
+
If the ignore-paths config key is set and the command line option is
also given, both regular expressions will be used.
+
Examples:
+
--
Skip "doc*" directory for every fetch;;
+
------------------------------------------------------------------------
--ignore-paths="^doc"
------------------------------------------------------------------------

Skip "branches" and "tags" of first level directories;;
+
------------------------------------------------------------------------
--ignore-paths="^[^/]+/(?:branches|tags)"
------------------------------------------------------------------------
--

--use-log-author;;
	When retrieving svn commits into git (as part of fetch, rebase, or
	dcommit operations), look for the first From: or Signed-off-by: line
	in the log message and use that as the author string.
--add-author-from;;
	When committing to svn from git (as part of commit or dcommit
	operations), if the existing log message doesn't already have a
	From: or Signed-off-by: line, append a From: line based on the
	git commit's author string.  If you use this, then --use-log-author
	will retrieve a valid author string for all commits.

'clone'::
	Runs 'init' and 'fetch'.  It will automatically create a
	directory based on the basename of the URL passed to it;
	or if a second argument is passed; it will create a directory
	and work within that.  It accepts all arguments that the
	'init' and 'fetch' commands accept; with the exception of
	'--fetch-all' and '--parent'.  After a repository is cloned,
	the 'fetch' command will be able to update revisions without
	affecting the working tree; and the 'rebase' command will be
	able to update the working tree with the latest changes.

'rebase'::
	This fetches revisions from the SVN parent of the current HEAD
	and rebases the current (uncommitted to SVN) work against it.
+
This works similarly to `svn update` or 'git pull' except that
it preserves linear history with 'git rebase' instead of
'git merge' for ease of dcommitting with 'git svn'.
+
This accepts all options that 'git svn fetch' and 'git rebase'
accept.  However, '--fetch-all' only fetches from the current
[svn-remote], and not all [svn-remote] definitions.
+
Like 'git rebase'; this requires that the working tree be clean
and have no uncommitted changes.

-l;;
--local;;
	Do not fetch remotely; only run 'git rebase' against the
	last fetched commit from the upstream SVN.

'dcommit'::
	Commit each diff from a specified head directly to the SVN
	repository, and then rebase or reset (depending on whether or
	not there is a diff between SVN and head).  This will create
	a revision in SVN for each commit in git.
	It is recommended that you run 'git svn' fetch and rebase (not
	pull or merge) your commits against the latest changes in the
	SVN repository.
	An optional revision or branch argument may be specified, and
	causes 'git svn' to do all work on that revision/branch
	instead of HEAD.
	This is advantageous over 'set-tree' (below) because it produces
	cleaner, more linear history.
+
--no-rebase;;
	After committing, do not rebase or reset.
--commit-url <URL>;;
	Commit to this SVN URL (the full path).  This is intended to
	allow existing 'git svn' repositories created with one transport
	method (e.g. `svn://` or `http://` for anonymous read) to be
	reused if a user is later given access to an alternate transport
	method (e.g. `svn+ssh://` or `https://`) for commit.
+
[verse]
config key: svn-remote.<name>.commiturl
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
+
Using this option for any other purpose (don't ask) is very strongly
discouraged.

'branch'::
	Create a branch in the SVN repository.

-m;;
--message;;
	Allows to specify the commit message.

-t;;
--tag;;
	Create a tag by using the tags_subdir instead of the branches_subdir
	specified during git svn init.

-d;;
--destination;;
	If more than one --branches (or --tags) option was given to the 'init'
	or 'clone' command, you must provide the location of the branch (or
	tag) you wish to create in the SVN repository.  The value of this
	option must match one of the paths specified by a --branches (or
	--tags) option.  You can see these paths with the commands
+
	git config --get-all svn-remote.<name>.branches
	git config --get-all svn-remote.<name>.tags
+
where <name> is the name of the SVN repository as specified by the -R option to
'init' (or "svn" by default).

'tag'::
	Create a tag in the SVN repository. This is a shorthand for
	'branch -t'.

'log'::
	This should make it easy to look up svn log messages when svn
	users refer to -r/--revision numbers.
+
The following features from `svn log' are supported:
+
--
-r <n>[:<n>];;
--revision=<n>[:<n>];;
	is supported, non-numeric args are not:
	HEAD, NEXT, BASE, PREV, etc ...
-v;;
--verbose;;
	it's not completely compatible with the --verbose
	output in svn log, but reasonably close.
--limit=<n>;;
	is NOT the same as --max-count, doesn't count
	merged/excluded commits
--incremental;;
	supported
--
+
New features:
+
--
--show-commit;;
	shows the git commit sha1, as well
--oneline;;
	our version of --pretty=oneline
--
+
NOTE: SVN itself only stores times in UTC and nothing else. The regular svn
client converts the UTC time to the local time (or based on the TZ=
environment). This command has the same behaviour.
+
Any other arguments are passed directly to 'git log'

'blame'::
       Show what revision and author last modified each line of a file. The
       output of this mode is format-compatible with the output of
       `svn blame' by default. Like the SVN blame command,
       local uncommitted changes in the working copy are ignored;
       the version of the file in the HEAD revision is annotated. Unknown
       arguments are passed directly to 'git blame'.
+
--git-format;;
	Produce output in the same format as 'git blame', but with
	SVN revision numbers instead of git commit hashes. In this mode,
	changes that haven't been committed to SVN (including local
	working-copy edits) are shown as revision 0.

'find-rev'::
	When given an SVN revision number of the form 'rN', returns the
	corresponding git commit hash (this can optionally be followed by a
	tree-ish to specify which branch should be searched).  When given a
	tree-ish, returns the corresponding SVN revision number.

'set-tree'::
	You should consider using 'dcommit' instead of this command.
	Commit specified commit or tree objects to SVN.  This relies on
	your imported fetch data being up-to-date.  This makes
	absolutely no attempts to do patching when committing to SVN, it
	simply overwrites files with those specified in the tree or
	commit.  All merging is assumed to have taken place
	independently of 'git svn' functions.

'create-ignore'::
	Recursively finds the svn:ignore property on directories and
	creates matching .gitignore files. The resulting files are staged to
	be committed, but are not committed. Use -r/--revision to refer to a
	specific revision.

'show-ignore'::
	Recursively finds and lists the svn:ignore property on
	directories.  The output is suitable for appending to
	the $GIT_DIR/info/exclude file.

'commit-diff'::
	Commits the diff of two tree-ish arguments from the
	command-line.  This command does not rely on being inside an `git svn
	init`-ed repository.  This command takes three arguments, (a) the
	original tree to diff against, (b) the new tree result, (c) the
	URL of the target Subversion repository.  The final argument
	(URL) may be omitted if you are working from a 'git svn'-aware
	repository (that has been `init`-ed with 'git svn').
	The -r<revision> option is required for this.

'info'::
	Shows information about a file or directory similar to what
	`svn info' provides.  Does not currently support a -r/--revision
	argument.  Use the --url option to output only the value of the
	'URL:' field.

'proplist'::
	Lists the properties stored in the Subversion repository about a
	given file or directory.  Use -r/--revision to refer to a specific
	Subversion revision.

'propget'::
	Gets the Subversion property given as the first argument, for a
	file.  A specific revision can be specified with -r/--revision.

'show-externals'::
	Shows the Subversion externals.  Use -r/--revision to specify a
	specific revision.

'gc'::
	Compress $GIT_DIR/svn/<refname>/unhandled.log files in .git/svn
	and remove $GIT_DIR/svn/<refname>index files in .git/svn.

'reset'::
	Undoes the effects of 'fetch' back to the specified revision.
	This allows you to re-'fetch' an SVN revision.  Normally the
	contents of an SVN revision should never change and 'reset'
	should not be necessary.  However, if SVN permissions change,
	or if you alter your --ignore-paths option, a 'fetch' may fail
	with "not found in commit" (file not previously visible) or
	"checksum mismatch" (missed a modification).  If the problem
	file cannot be ignored forever (with --ignore-paths) the only
	way to repair the repo is to use 'reset'.
+
Only the rev_map and refs/remotes/git-svn are changed.  Follow 'reset'
with a 'fetch' and then 'git reset' or 'git rebase' to move local
branches onto the new tree.

-r <n>;;
--revision=<n>;;
	Specify the most recent revision to keep.  All later revisions
	are discarded.
-p;;
--parent;;
	Discard the specified revision as well, keeping the nearest
	parent instead.
Example:;;
Assume you have local changes in "master", but you need to refetch "r2".
+
------------
    r1---r2---r3 remotes/git-svn
                \
                 A---B master
------------
+
Fix the ignore-paths or SVN permissions problem that caused "r2" to
be incomplete in the first place.  Then:
+
[verse]
git svn reset -r2 -p
git svn fetch
+
------------
    r1---r2'--r3' remotes/git-svn
      \
       r2---r3---A---B master
------------
+
Then fixup "master" with 'git rebase'.