Путеводитель по Руководству Linux

  User  |  Syst  |  Libr  |  Device  |  Files  |  Other  |  Admin  |  Head  |



   git-svn    ( 1 )

двунаправленная операция между репозиторием Subversion и Git (Bidirectional operation between a Subversion repository and Git)

Команды (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. This option is not recommended, please read the svn.noMetadata section of this manpage before using this option.

--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.

--rewrite-uuid=<UUID> Set the rewriteUUID 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 (e.g. svn+ssh://), you must include the username in the URL, e.g. 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 (with a trailing slash) is strongly 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. By default, the prefix is set to origin/.

Note Before Git v2.0, the default prefix was "" (no prefix). This meant that SVN-tracking refs were put at "refs/remotes/*", which is incompatible with how Git's own remote-tracking refs are organized. If you still want the old default, you can get it by passing --prefix "" on the command line (--prefix="" may not work if your Perl's Getopt::Long is < v2.37).

--ignore-refs=<regex> When passed to init or clone this regular expression will be preserved as a config key. See fetch for a description of --ignore-refs.

--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.

--include-paths=<regex> When passed to init or clone this regular expression will be preserved as a config key. See fetch for a description of --include-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_DIR/config file may be specified as an optional 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 Store Git commit times in the local time zone instead of UTC. This makes git log (even without --date=local) show the same times that svn log would in the local time zone.

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 time zone.

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

--ignore-refs=<regex> Ignore refs for branches or tags matching the Perl regular expression. A "negative look-ahead assertion" like ^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$ can be used to allow only certain refs.

config key: svn-remote.<name>.ignore-refs

If the ignore-refs configuration key is set, and the command-line option is also given, both regular expressions will be used.

--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.

config key: svn-remote.<name>.ignore-paths

If the ignore-paths configuration 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)"

--include-paths=<regex> This allows one to specify a Perl regular expression that will cause the inclusion of only matching paths from checkout from SVN. The --include-paths option should match for every fetch (including automatic fetches due to clone, dcommit, rebase, etc) on a given repository. --ignore-paths takes precedence over --include-paths.

config key: svn-remote.<name>.include-paths

--log-window-size=<n> Fetch <n> log entries per request when scanning Subversion history. The default is 100. For very large Subversion repositories, larger values may be needed for clone/fetch to complete in reasonable time. But overly large values may lead to higher memory usage and request timeouts.

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.

--preserve-empty-dirs Create a placeholder file in the local Git repository for each empty directory fetched from Subversion. This includes directories that become empty by removing all entries in the Subversion repository (but not the directory itself). The placeholder files are also tracked and removed when no longer necessary.

--placeholder-filename=<filename> Set the name of placeholder files created by --preserve-empty-dirs. Default: ".gitignore"

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.

This automatically updates the rev_map if needed (see $GIT_DIR/svn/**/.rev_map.* in the FILES section below for details).

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

dcommit Commit each diff from the current branch 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.

When an optional Git branch name (or a Git commit object name) is specified as an argument, the subcommand works on the specified branch, not on the current branch.

Use of dcommit is preferred to set-tree (below).

--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.

config key: svn-remote.<name>.commiturl config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)

Note that the SVN URL of the commiturl config key includes the SVN branch. If you rather want to set the commit URL for an entire SVN repository use svn-remote.<name>.pushurl instead.

Using this option for any other purpose (don't ask) is very strongly discouraged.

--mergeinfo=<mergeinfo> Add the given merge information during the dcommit (e.g. --mergeinfo="/branches/foo:1-10"). All svn server versions can store this information (as a property), and svn clients starting from version 1.5 can make use of it. To specify merge information from multiple branches, use a single space character between the branches (--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8")

config key: svn.pushmergeinfo

This option will cause git-svn to attempt to automatically populate the svn:mergeinfo property in the SVN repository when possible. Currently, this can only be done when dcommitting non-fast-forward merges where all parents but the first have already been pushed into SVN.

--interactive Ask the user to confirm that a patch set should actually be sent to SVN. For each patch, one may answer "yes" (accept this patch), "no" (discard this patch), "all" (accept all patches), or "quit".

git svn dcommit returns immediately if answer is "no" or "quit", without committing anything to SVN.

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<path>, --destination=<path> 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. <path> specifies which path to use to create the branch or tag and should match the pattern on the left-hand side of one of the configured branches or tags refspecs. You can see these refspecs 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).

--username Specify the SVN username to perform the commit as. This option overrides the username configuration property.

--commit-url Use the specified URL to connect to the destination Subversion repository. This is useful in cases where the source SVN repository is read-only. This option overrides configuration property commiturl.

git config --get-all svn-remote.<name>.commiturl

--parents Create parent folders. This parameter is equivalent to the parameter --parents on svn cp commands and is useful for non-standard repository layouts.

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 tree 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.

-B, --before Don't require an exact match if given an SVN revision, instead find the commit corresponding to the state of the SVN repository (on the current branch) at the specified revision.

-A, --after Don't require an exact match if given an SVN revision; if there is not an exact match return the closest match searching forward in the history.

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.

mkdirs Attempts to recreate empty directories that core Git cannot track based on information in $GIT_DIR/svn/<refname>/unhandled.log files. Empty directories are automatically recreated when using "git svn clone" and "git svn rebase", so "mkdirs" is intended for use after commands like "git checkout" or "git reset". (See the svn-remote.<name>.automkdirs config file option for more information.)

commit-diff Commits the diff of two tree-ish arguments from the command-line. This command does not rely on being inside a 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.

The commit message is supplied either directly with the -m or -F option, or indirectly from the tag or commit when the second tree-ish denotes such an object, or it is requested by invoking an editor (see --edit option below).

-m <msg>, --message=<msg> Use the given msg as the commit message. This option disables the --edit option.

-F <filename>, --file=<filename> Take the commit message from the given file. This option disables the --edit option.

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.

propset Sets the Subversion property given as the first argument, to the value given as the second argument for the file given as the third argument.

Example:

git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile

This will set the property svn:keywords to FreeBSD=%H for the file devel/py-tipper/Makefile.

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

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

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 (see $GIT_DIR/svn/**/.rev_map.* in the FILES section below for details). 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:

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. Do NOT use git merge or your history will not be compatible with a future dcommit!

git rebase --onto remotes/git-svn A^ master

r1---r2'--r3' remotes/git-svn \ A'--B' master