日本語 ▾ トピック ▾ 最新バージョン ▾ git-svn は 2.47.0 で最終更新

名前

git-svn - SubversionリポジトリとGit間の双方向操作

概要

git svn <command> [<options>] [<arguments>]

説明

git svnは、SubversionとGit間の変更セットのシンプルな導管です。これは、SubversionとGitリポジトリ間で変更の双方向フローを提供します。

git svnは、--stdlayoutオプションを使用して、一般的な「trunk/branches/tags」レイアウトに従う標準のSubversionリポジトリを追跡できます。また、-T/-t/-bオプション(以下のinitのオプションおよびcloneコマンドを参照)を使用して、任意のレイアウトのブランチとタグを追跡することもできます。

Subversionリポジトリを追跡した(上記いずれかの方法で)後、GitリポジトリはfetchコマンドによってSubversionから更新され、SubversionはdcommitコマンドによってGitから更新されます。

コマンド

init

git svnの追加メタデータディレクトリを持つ空のGitリポジトリを初期化します。SubversionのURLはコマンドライン引数として指定することも、-T/-t/-bの完全なURL引数として指定することもできます。オプションとして、操作対象のターゲットディレクトリを2番目の引数として指定できます。通常、このコマンドは現在のディレクトリを初期化します。

-T<trunk-subdir>
--trunk=<trunk-subdir>
-t<tags-subdir>
--tags=<tags-subdir>
-b<branches-subdir>
--branches=<branches-subdir>
-s
--stdlayout

これらはinitのオプションのコマンドラインオプションです。これらの各フラグは、相対リポジトリパス (--tags=project/tags) または完全なURL (--tags=https://foo.org/project/tags) を指すことができます。Subversionリポジトリがタグまたはブランチを複数のパスの下に配置している場合、複数の--tagsおよび/または--branchesオプションを指定できます。--stdlayoutオプションは、trunk、tags、branchesを相対パスとして設定する省略形であり、これはSubversionのデフォルトです。他のオプションも指定されている場合、それらが優先されます。

--no-metadata

[svn-remote] 設定でnoMetadataオプションを設定します。このオプションは推奨されません。このオプションを使用する前に、このmanページのsvn.noMetadataセクションをお読みください。

--use-svm-props

[svn-remote] 設定でuseSvmPropsオプションを設定します。

--use-svnsync-props

[svn-remote] 設定でuseSvnsyncPropsオプションを設定します。

--rewrite-root=<URL>

[svn-remote] 設定でrewriteRootオプションを設定します。

--rewrite-uuid=<UUID>

[svn-remote] 設定でrewriteUUIDオプションを設定します。

--username=<user>

SVNが認証を処理するトランスポート (http, https, plain svn) の場合、ユーザー名を指定します。他のトランスポート (例: svn+ssh://) の場合、URLにユーザー名を含める必要があります (例: svn+ssh://foo@svn.bar.com/project)。

--prefix=<prefix>

これは、trunk/branches/tagsが指定されている場合に、リモートの名前に先行するプレフィックスを指定することを可能にします。プレフィックスには末尾のスラッシュが自動的に含まれないため、必要な場合は引数に含めるようにしてください。--branches/-bが指定されている場合、プレフィックスには末尾のスラッシュを含める必要があります。いずれの場合も、プレフィックス(末尾のスラッシュ付き)を設定することを強くお勧めします。そうすることで、SVN追跡リファレンスが"refs/remotes/$prefix/"に配置され、これはGit自身のリモート追跡リファレンスレイアウト (refs/remotes/$remote/) と互換性があります。プレフィックスの設定は、共通のリポジトリを共有する複数のプロジェクトを追跡したい場合にも役立ちます。デフォルトでは、プレフィックスはorigin/に設定されています。

注意
Git v2.0より前は、デフォルトのプレフィックスは""(プレフィックスなし)でした。これは、SVN追跡リファレンスが"refs/remotes/*"に配置され、Git自身のリモート追跡リファレンスが整理される方法と互換性がないことを意味していました。古いデフォルトを維持したい場合は、コマンドラインで--prefix ""を渡すことで取得できます(PerlのGetopt::Longがv2.37より前の場合、--prefix=""は機能しない場合があります)。
--ignore-refs=<regex>

initまたはcloneに渡された場合、この正規表現は設定キーとして保持されます。--ignore-refsの説明についてはfetchを参照してください。

--ignore-paths=<regex>

initまたはcloneに渡された場合、この正規表現は設定キーとして保持されます。--ignore-pathsの説明についてはfetchを参照してください。

--include-paths=<regex>

initまたはcloneに渡された場合、この正規表現は設定キーとして保持されます。--include-pathsの説明についてはfetchを参照してください。

--no-minimize-url

複数のディレクトリを追跡している場合(--stdlayout、--branches、または--tagsオプションを使用)、git svnはSubversionリポジトリのルート(または許可された最高レベル)に接続しようとします。このデフォルトは、プロジェクト全体がリポジトリ内で移動された場合に履歴の追跡を改善しますが、読み取りアクセス制限が設定されているリポジトリでは問題を引き起こす可能性があります。--no-minimize-urlを渡すと、git svnはより高レベルのディレクトリへの接続を試みずにURLをそのまま受け入れます。このオプションは、1つのURL/ブランチのみが追跡されている場合はデフォルトでオフになっています(ほとんど役に立ちません)。

fetch

追跡しているSubversionリモートから、まだフェッチされていないリビジョンをフェッチします。$GIT_DIR/config ファイル内の [svn-remote "…​"] セクションの名前は、オプションのコマンドライン引数として指定できます。

これは、必要に応じてrev_mapを自動的に更新します(詳細は、以下のFILESセクションの$GIT_DIR/svn/**/.rev_map.*を参照)。

--localtime

Gitのコミット時間をUTCではなくローカルタイムゾーンで保存します。これにより、git log(--date=localなしでも)が、svn logがローカルタイムゾーンで表示するのと同じ時間を表示するようになります。

これは、クローン元のSubversionリポジトリとの相互運用には干渉しませんが、ローカルのGitリポジトリが他の誰かのローカルのGitリポジトリと相互運用できるようにしたい場合は、このオプションを使用しないか、両方が同じローカルタイムゾーンで使用する必要があります。

--parent

現在のHEADのSVN親からのみフェッチします。

--ignore-refs=<regex>

Perl正規表現に一致するブランチまたはタグのリファレンスを無視します。特定の参照のみを許可するために、^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$のような「否定先読みアサーション」を使用できます。

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

ignore-refs設定キーが設定され、コマンドラインオプションも指定されている場合、両方の正規表現が使用されます。

--ignore-paths=<regex>

これにより、SVNからのチェックアウト時に一致するすべてのパスをスキップさせるPerl正規表現を指定できます。--ignore-pathsオプションは、特定のレポジトリに対するすべてのfetchclonedcommitrebaseなどによる自動フェッチを含む)に一致する必要があります。

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

ignore-paths設定キーが設定され、コマンドラインオプションも指定されている場合、両方の正規表現が使用されます。

すべてのフェッチで"doc*"ディレクトリをスキップ
--ignore-paths="^doc"
第一レベルディレクトリの"branches"と"tags"をスキップ
--ignore-paths="^[^/]+/(?:branches|tags)"
--include-paths=<regex>

これにより、SVNからのチェックアウト時に、一致するパスのみを含めるPerl正規表現を指定できます。--include-pathsオプションは、特定のレポジトリに対するすべてのfetchclonedcommitrebaseなどによる自動フェッチを含む)に一致する必要があります。--ignore-paths--include-pathsよりも優先されます。

config key: svn-remote.<name>.include-paths
--log-window-size=<n>

Subversion履歴をスキャンする際に、リクエストごとに<n>件のログエントリをフェッチします。デフォルトは100です。非常に大規模なSubversionリポジトリの場合、clone/fetchを妥当な時間で完了させるには、より大きな値が必要になる場合があります。しかし、値が大きすぎると、メモリ使用量が増加したり、リクエストがタイムアウトしたりする可能性があります。

clone

initfetchを実行します。URLのベース名に基づいて自動的にディレクトリを作成します。または、2番目の引数が渡された場合、ディレクトリを作成し、その中で作業します。これは、fetchコマンドとinitコマンドが受け入れるすべての引数を受け入れます。ただし、--fetch-all--parentは除きます。リポジトリがクローンされた後、fetchコマンドは作業ツリーに影響を与えずにリビジョンを更新できるようになり、rebaseコマンドは最新の変更で作業ツリーを更新できるようになります。

--preserve-empty-dirs

Subversionからフェッチされた各空ディレクトリに対して、ローカルGitリポジトリにプレースホルダーファイルを作成します。これには、Subversionリポジトリ内のすべてのエントリを削除することで空になったディレクトリも含まれます(ただし、ディレクトリ自体は含まれません)。プレースホルダーファイルも追跡され、不要になった場合は削除されます。

--placeholder-filename=<filename>

--preserve-empty-dirsによって作成されるプレースホルダーファイルの名前を設定します。デフォルト: ".gitignore"

rebase

これは、現在のHEADのSVN親からリビジョンをフェッチし、現在の(SVNにコミットされていない)作業をそれに対してリベースします。

これは、svn updategit pullと同様に機能しますが、git svnでのdcommitを容易にするために、git mergeの代わりにgit rebaseで線形履歴を保持する点が異なります。

これは、git svn fetchgit rebaseが受け入れるすべてのオプションを受け入れます。ただし、--fetch-allは現在の[svn-remote]からのみフェッチし、すべての[svn-remote]定義からはフェッチしません。

git rebaseと同様に、作業ツリーがクリーンであり、未コミットの変更がないことが必要です。

これは、必要に応じてrev_mapを自動的に更新します(詳細は、以下のFILESセクションの$GIT_DIR/svn/**/.rev_map.*を参照)。

-l
--local

リモートからフェッチしません。アップストリームSVNからの最終フェッチコミットに対してのみgit rebaseを実行します。

dcommit

現在のブランチからの各diffを直接SVNリポジトリにコミットし、その後リベースまたはリセットします(SVNとheadの間にdiffがあるかどうかに応じて)。これにより、Gitの各コミットに対してSVNにリビジョンが作成されます。

オプションのGitブランチ名(またはGitコミットオブジェクト名)が引数として指定された場合、サブコマンドは現在のブランチではなく、指定されたブランチで動作します。

dcommitの使用は、set-tree(下記)よりも推奨されます。

--no-rebase

コミット後、リベースまたはリセットは行いません。

--commit-url <URL>

このSVN URL(フルパス)にコミットします。これは、既存のgit svnリポジトリが1つのトランスポート方法(例:匿名読み取り用のsvn://またはhttp://)で作成された場合でも、後でユーザーがコミット用の代替トランスポート方法(例:svn+ssh://またはhttps://)にアクセスできるようになった場合に再利用できるようにすることを目的としています。

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

commiturl設定キーのSVN URLにはSVNブランチが含まれることに注意してください。SVNリポジトリ全体のコミットURLを設定したい場合は、代わりにsvn-remote.<name>.pushurlを使用してください。

このオプションを他の目的で使用することは(尋ねないでください)強く非推奨です。

--mergeinfo=<mergeinfo>

dcommit中に指定されたマージ情報(例:--mergeinfo="/branches/foo:1-10")を追加します。すべてのsvnサーバーバージョンはこの情報(プロパティとして)を保存でき、バージョン1.5以降のsvnクライアントはこれを利用できます。複数のブランチからのマージ情報を指定するには、ブランチ間に単一のスペース文字を使用します(--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8")。

config key: svn.pushmergeinfo

このオプションを使用すると、git-svnは可能な場合にSVNリポジトリのsvn:mergeinfoプロパティを自動的に設定しようとします。現在、これは、非ファストフォワードマージをdcommitする場合にのみ実行できます。ただし、最初の親以外のすべての親はすでにSVNにプッシュされている必要があります。

--interactive

パッチセットを実際にSVNに送信するかどうかをユーザーに確認します。各パッチについて、「yes」(このパッチを受け入れる)、「no」(このパッチを破棄する)、「all」(すべてのパッチを受け入れる)、または「quit」と答えることができます。

「no」または「quit」と答えた場合、git svn dcommitはSVNに何もコミットせずに即座に終了します。

branch

SVNリポジトリにブランチを作成します。

-m
--message

コミットメッセージを指定できます。

-t
--tag

git svn init時に指定されたbranches_subdirの代わりにtags_subdirを使用してタグを作成します。

-d<path>
--destination=<path>

initまたはcloneコマンドに複数の--branches(または--tags)オプションが与えられた場合、SVNリポジトリに作成したいブランチ(またはタグ)の場所を指定する必要があります。<path>は、ブランチまたはタグを作成するために使用するパスを指定し、設定されたブランチまたはタグのリファレンス仕様の左側のパターンと一致する必要があります。これらのリファレンス仕様は、次のコマンドで確認できます。

git config --get-all svn-remote.<name>.branches
git config --get-all svn-remote.<name>.tags

ここで、<name>はinitへの-Rオプションで指定されたSVNリポジトリの名前(またはデフォルトで"svn")です。

--username

コミットを実行するSVNユーザー名を指定します。このオプションはusername設定プロパティを上書きします。

--commit-url

指定されたURLを使用して、宛先Subversionリポジトリに接続します。これは、ソースSVNリポジトリが読み取り専用の場合に便利です。このオプションは、設定プロパティcommiturlを上書きします。

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

親フォルダを作成します。このパラメータはsvn cpコマンドの--parentsパラメータと同等であり、非標準のリポジトリレイアウトに役立ちます。

tag

SVNリポジトリにタグを作成します。これはbranch -tの省略形です。

log

これにより、svnユーザーが-r/--revision番号を参照する際に、svnログメッセージを簡単に検索できるようになります。

「svn log」の以下の機能がサポートされています

-r <n>[:<n>]
--revision=<n>[:<n>]

はサポートされていますが、HEAD、NEXT、BASE、PREVなどの非数値引数はサポートされていません。

-v
--verbose

svn logの--verbose出力とは完全に互換性はありませんが、かなり近いです。

--limit=<n>

は--max-countと同じではありません。マージされた/除外されたコミットはカウントされません。

--incremental

サポートされています

新機能

--show-commit

Gitコミットのsha1も表示します。

--oneline

--pretty=onelineの当社のバージョン

注意
SVN自体は時間をUTCでしか保存せず、それ以外の形式では保存しません。通常のsvnクライアントはUTC時間をローカル時間(またはTZ=環境変数に基づいて)に変換します。このコマンドも同じ動作をします。

その他の引数はすべてgit logに直接渡されます。

blame

ファイルの各行を最後に変更したリビジョンと作者を表示します。このモードの出力は、デフォルトで「svn blame」の出力と互換性があります。SVN blameコマンドと同様に、作業ツリー内のローカルの未コミットの変更は無視されます。HEADリビジョンのファイルバージョンが注釈付けされます。不明な引数はgit blameに直接渡されます。

--git-format

git blameと同じ形式で出力しますが、Gitコミットハッシュの代わりにSVNリビジョン番号を使用します。このモードでは、SVNにコミットされていない変更(ローカルの作業コピー編集を含む)はリビジョン0として表示されます。

find-rev

rN形式のSVNリビジョン番号が与えられた場合、対応するGitコミットハッシュを返します(オプションで、検索するブランチを指定するためにtree-ishを続けることもできます)。tree-ishが与えられた場合、対応するSVNリビジョン番号を返します。

-B
--before

SVNリビジョンが与えられた場合でも厳密な一致を求めず、代わりに指定されたリビジョンでのSVNリポジトリ(現在のブランチ上)の状態に対応するコミットを見つけます。

-A
--after

SVNリビジョンが与えられても厳密な一致を要求しません。厳密な一致がない場合、履歴を前方に検索して最も近い一致を返します。

set-tree

このコマンドの代わりにdcommitの使用を検討してください。指定されたコミットまたはツリーオブジェクトをSVNにコミットします。これは、インポートされたフェッチデータが最新であることに依存します。SVNにコミットする際にパッチを適用しようとすることは一切なく、ツリーまたはコミットで指定されたファイルで単にファイルを上書きします。すべてのマージはgit svn関数とは独立して行われたと仮定されます。

create-ignore

ディレクトリ上のsvn:ignoreおよびsvn:global-ignoresプロパティを再帰的に検索し、対応する.gitignoreファイルを作成します。結果のファイルはコミットするためにステージングされますが、コミットはされません。特定の変更を参照するには-r/--revisionを使用します。

show-ignore

ディレクトリ上のsvn:ignoreおよびsvn:global-ignoresプロパティを再帰的に検索し、リスト表示します。出力は$GIT_DIR/info/excludeファイルに追加するのに適しています。

mkdirs

$GIT_DIR/svn/<refname>/unhandled.logファイルの情報に基づいて、コアGitが追跡できない空のディレクトリを再作成しようとします。空のディレクトリは「git svn clone」および「git svn rebase」の使用時に自動的に再作成されるため、「mkdirs」は「git checkout」や「git reset」などのコマンドの後に使用することを目的としています。(詳細については、svn-remote.<name>.automkdirs設定ファイルオプションを参照してください。)

commit-diff

コマンドラインから2つのtree-ish引数のdiffをコミットします。このコマンドは、git svn initされたリポジトリ内にいることに依存しません。このコマンドは3つの引数を取ります。(a) diffの元のツリー、(b) 新しいツリーの結果、(c) ターゲットSubversionリポジトリのURLです。最後の引数 (URL) は、git svnを認識するリポジトリ (git svninitされている) から作業している場合は省略できます。この場合、-r<revision>オプションが必要です。

コミットメッセージは、-mまたは-Fオプションで直接提供されるか、2番目のtree-ishがそのようなオブジェクトを示す場合にタグまたはコミットから間接的に提供されるか、またはエディタを呼び出すことで要求されます(下記の--editオプションを参照)。

-m <msg>
--message=<msg>

指定されたmsgをコミットメッセージとして使用します。このオプションは--editオプションを無効にします。

-F <filename>
--file=<filename>

コミットメッセージを指定されたファイルから取得します。このオプションは--editオプションを無効にします。

info

「svn info」が提供するものと同様の、ファイルまたはディレクトリに関する情報を表示します。現在、-r/--revision引数はサポートしていません。URL:フィールドの値のみを出力するには--urlオプションを使用します。

proplist

指定されたファイルまたはディレクトリに関してSubversionリポジトリに保存されているプロパティをリスト表示します。特定のSubversionリビジョンを参照するには-r/--revisionを使用します。

propget

ファイルに対して、最初の引数として与えられたSubversionプロパティを取得します。特定の変更は-r/--revisionで指定できます。

propset

最初の引数として与えられたSubversionプロパティを、2番目の引数として与えられた値に設定し、3番目の引数として与えられたファイルに適用します。

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

これにより、ファイルdevel/py-tipper/Makefileのプロパティsvn:keywordsFreeBSD=%Hに設定されます。

show-externals

Subversionの外部定義を表示します。特定の変更を指定するには-r/--revisionを使用します。

gc

$GIT_DIR/svn/<refname>/unhandled.log ファイルを圧縮し、$GIT_DIR/svn/<refname>/index ファイルを削除します。

reset

指定されたリビジョンまでfetchの効果を元に戻します。これにより、SVNリビジョンを再fetchすることができます。通常、SVNリビジョンの内容は変更されるべきではなく、resetは必要ありません。ただし、SVNの権限が変更されたり、--ignore-pathsオプションを変更したりすると、fetchが「not found in commit」(ファイルが以前に表示されなかった)または「checksum mismatch」(変更を見逃した)で失敗する場合があります。問題のファイルを永続的に無視できない場合(--ignore-pathsを使用しても)、リポジトリを修復する唯一の方法はresetを使用することです。

rev_mapとrefs/remotes/git-svnのみが変更されます(詳細は以下のFILESセクションの$GIT_DIR/svn/**/.rev_map.*を参照)。resetの後にfetchgit resetまたはgit rebaseを実行して、ローカルブランチを新しいツリーに移動させます。

-r <n>
--revision=<n>

保持する最新リビジョンを指定します。それ以降のすべてのリビジョンは破棄されます。

-p
--parent

指定されたリビジョンも破棄し、代わりに最も近い親を保持します。

「master」にローカルの変更があるが、「r2」を再フェッチする必要があると仮定します。

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

そもそも「r2」が不完全だった原因であるignore-pathsまたはSVNパーミッションの問題を修正します。その後、

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

次に、git rebaseで「master」を修正します。git mergeは使用しないでください。そうしないと、履歴が将来のdcommitと互換性がなくなります!

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

オプション

--shared[=(false|true|umask|group|all|world|everybody)]
--template=<template-directory>

initコマンドでのみ使用されます。これらはgit initに直接渡されます。

-r <arg>
--revision <arg>

fetchコマンドで使用されます。

これにより、部分的/削除された履歴のリビジョン範囲がサポートされます。$NUMBER、$NUMBER1:$NUMBER2 (数値範囲)、$NUMBER:HEAD、BASE:$NUMBERのすべてがサポートされています。

これにより、フェッチ実行時に部分的なミラーを作成できますが、履歴がスキップされて失われるため、通常は推奨されません。

-
--stdin

set-treeコマンドでのみ使用されます。

stdinからコミットのリストを読み込み、逆順でコミットします。各行の先頭のsha1のみが読み取られるため、git rev-list --pretty=onelineの出力を使用できます。

--rmdir

dcommitset-treecommit-diffコマンドでのみ使用されます。

ファイルが残っていない場合、SVNツリーからディレクトリを削除します。SVNは空のディレクトリもバージョン管理でき、ファイルが残っていない場合でもデフォルトでは削除されません。Gitは空のディレクトリをバージョン管理できません。このフラグを有効にすると、SVNへのコミットがGitのように動作します。

config key: svn.rmdir
-e
--edit

dcommitset-treecommit-diffコマンドでのみ使用されます。

SVNにコミットする前にコミットメッセージを編集します。これは、コミットであるオブジェクトに対してはデフォルトでオフになり、ツリーオブジェクトをコミットする場合には強制的にオンになります。

config key: svn.edit
-l<num>
--find-copies-harder

dcommitset-treecommit-diffコマンドでのみ使用されます。

どちらもgit diff-treeに直接渡されます。詳細についてはgit-diff-tree[1]を参照してください。

config key: svn.l
config key: svn.findcopiesharder
-A<filename>
--authors-file=<filename>

構文はgit cvsimportが使用するファイルと互換性がありますが、空のメールアドレスは<>で指定できます。

	loginname = Joe User <user@example.com>

このオプションが指定され、git svnがauthors-fileに存在しないSVNコミッター名に遭遇した場合、git svnは操作を中止します。ユーザーは適切なエントリを追加する必要があります。authors-fileの変更後に以前のgit svnコマンドを再実行すると、操作が続行されるはずです。

config key: svn.authorsfile
--authors-prog=<filename>

このオプションが指定されている場合、authorsファイルに存在しない各SVNコミッター名に対して、指定されたファイルがコミッター名を最初の引数として実行されます。プログラムは「Name <email>」または「Name <>」の形式で1行を返すことが期待されており、authorsファイルに含まれているかのように扱われます。

歴史的な理由により、相対的なfilenameはまずinitcloneに対しては現在のディレクトリに対して相対的に、fetchに対しては作業ツリーのルートに対して相対的に検索されます。filenameが見つからない場合、$PATH内の他のコマンドと同様に検索されます。

config key: svn.authorsProg
-q
--quiet

git svnの冗長性を低減します。2回指定するとさらに冗長性が低減されます。

-m
--merge
-s<strategy>
--strategy=<strategy>
-p
--rebase-merges

これらはdcommitおよびrebaseコマンドでのみ使用されます。

git resetが使用できない場合、dcommitを使用する際にgit rebaseに直接渡されます(dcommitを参照)。

-n
--dry-run

これはdcommitrebasebranchtagコマンドで使用できます。

dcommitの場合、SVNにコミットされるdiffを示すGit引数のシーケンスを出力します。

rebaseの場合、現在のブランチに関連付けられたアップストリームsvnリポジトリと、フェッチ元のsvnリポジトリのURLを表示します。

branchtagの場合、ブランチまたはタグを作成する際にコピーに使用されるURLを表示します。

--use-log-author

SVNコミットをGitに取り込む際(fetchrebase、またはdcommit操作の一部として)、ログメッセージの最初のFrom:行またはSigned-off-byトレーラーを検索し、それを作者文字列として使用します。

config key: svn.useLogAuthor
--add-author-from

Gitからsvnにコミットする際(set-treeまたはdcommit操作の一部として)、既存のログメッセージにすでにFrom:またはSigned-off-byトレーラーがない場合、Gitコミットの作者文字列に基づいてFrom:行を追加します。これを使用すると、--use-log-authorはすべてのコミットに対して有効な作者文字列を取得します。

config key: svn.addAuthorFrom

高度なオプション

-i<GIT_SVN_ID>
--id <GIT_SVN_ID>

これはGIT_SVN_IDを設定します(環境変数を使用する代わりに)。これにより、ユーザーは単一のURLを追跡する際に、デフォルトのフェッチ元refnameを上書きできます。logコマンドとdcommitコマンドは、引数としてこのスイッチを必要としなくなりました。

-R<remote-name>
--svn-remote <remote-name>

使用する[svn-remote "<remote-name>"]セクションを指定します。これにより、複数のSVNリポジトリを追跡できます。デフォルト: "svn"

--follow-parent

このオプションは、ブランチを追跡している場合(--trunk、--tags、--branches、--stdlayoutなどのリポジトリレイアウトオプションのいずれかを使用している場合)にのみ関連します。追跡対象の各ブランチについて、そのリビジョンがどこからコピーされたかを調べ、そのブランチの最初のGitコミットに適切な親を設定しようとします。これは、リポジトリ内で移動されたディレクトリを追跡している場合に特に役立ちます。この機能が無効になっている場合、git svnによって作成されたブランチはすべて線形になり、履歴を共有しないため、ブランチがどこから分岐またはマージされたかに関する情報がなくなります。ただし、長く複雑な履歴を追跡するには時間がかかる場合があるため、この機能を無効にするとクローン作成プロセスが高速化される可能性があります。この機能はデフォルトで有効になっており、無効にするには--no-follow-parentを使用します。

config key: svn.followparent

設定ファイルのみのオプション

svn.noMetadata
svn-remote.<name>.noMetadata

これにより、すべてのコミットの末尾にあるgit-svn-id:行が削除されます。

このオプションは、git svnがメタデータなしでは再フェッチできなくなるため、一度きりのインポートにのみ使用できます。さらに、$GIT_DIR/svn/**/.rev_map.*ファイルが失われた場合、git svnはそれらを再構築できません。

git svn logコマンドも、これを使用するリポジトリでは機能しません。(お察しの通り)useSvmPropsオプションと競合します。

このオプションは、既存のドキュメント、バグ報告、アーカイブ内のSVNリビジョン番号への古い参照を追跡することを困難にするため、推奨されません。最終的にSVNからGitに移行し、SVN履歴を破棄することを確信している場合は、代わりにgit-filter-repoを検討してください。filter-repoは、読みやすくするためにメタデータを再フォーマットしたり、「svn.authorsFile」を使用しないユーザーのために作者情報を書き換えたりすることもできます。

svn.useSvmProps
svn-remote.<name>.useSvmProps

これにより、git svnは、SVN::Mirror(またはsvk)を使用して作成されたミラーから、リポジトリのURLとUUIDをメタデータ用に再マッピングできます。

SVNリビジョンにプロパティ「svm:headrev」がある場合、そのリビジョンはSVN::Mirror(SVKでも使用されている)によって作成された可能性があります。このプロパティにはリポジトリのUUIDとリビジョンが含まれています。オリジナルのURLをミラーリングしているように見せたいので、オリジナルのID URLとUUIDを返すヘルパー関数を導入し、コミットメッセージでメタデータを生成する際にそれを使用します。

svn.useSvnsyncProps
svn-remote.<name>.useSvnsyncprops

useSvmPropsオプションと同様に、これはSVN 1.4.x以降に配布されているsvnsync(1)コマンドのユーザー向けです。

svn-remote.<name>.rewriteRoot

これにより、ユーザーは代替URLからリポジトリを作成できます。たとえば、管理者はサーバー上でローカルにgit svnを実行できます(file://経由でアクセス)が、メタデータ内に公開http://またはsvn://URLを持つリポジトリを配布したい場合、そのユーザーは公開URLを参照することになります。

svn-remote.<name>.rewriteUUID

useSvmPropsオプションと同様に、これはUUIDを手動で再マッピングする必要があるユーザー向けです。これは、useSvmPropsまたはuseSvnsyncPropsのいずれかを通じて元のUUIDが利用できない状況で役立つ場合があります。

svn-remote.<name>.pushurl

Gitのremote.<name>.pushurlと同様に、このキーは、urlが読み取り専用トランスポートを介してSVNリポジトリを指す場合に、代替の読み書きトランスポートを提供するために設計されています。両方のキーが同じリポジトリを指していると仮定されます。commiturlとは異なり、pushurlはベースパスです。commiturlまたはpushurlのいずれかを使用できる場合、commiturlが優先されます。

svn.brokenSymlinkWorkaround

これは、壊れたクライアントによってSVNにチェックインされた壊れたシンボリックリンクの回避策として、コストのかかる可能性のあるチェックを無効にします。シンボリックリンクではない多くの空のblobを持つSVNリポジトリを追跡する場合、このオプションを「false」に設定します。このオプションは、git svnの実行中に変更でき、次にフェッチされるリビジョンに影響します。設定されていない場合、git svnはこのオプションを「true」と仮定します。

svn.pathnameencoding

これは、git svnにパス名を指定されたエンコーディングに再コード化するよう指示します。Windowsユーザーや非UTF-8ロケールで作業するユーザーが、非ASCII文字を含む破損したファイル名を避けるために使用できます。有効なエンコーディングは、PerlのEncodeモジュールがサポートするものです。

svn-remote.<name>.automkdirs

通常、「git svn clone」および「git svn rebase」コマンドは、Subversionリポジトリ内の空のディレクトリを再作成しようとします。このオプションが「false」に設定されている場合、空のディレクトリは「git svn mkdirs」コマンドが明示的に実行された場合にのみ作成されます。設定されていない場合、git svnはこのオプションを「true」と仮定します。

noMetadata、rewriteRoot、rewriteUUID、useSvnsyncProps、useSvmPropsの各オプションは、すべてgit svnによって生成および使用されるメタデータに影響するため、履歴がインポートされる前に設定ファイルに設定されなければなりません。また、これらの設定は一度設定されたら決して変更してはなりません。

さらに、rewriteRootとrewriteUUIDは一緒に使用できますが、これらのオプションのうち1つのみをsvn-remoteセクションごとに使用できます。これは、git-svn-id:メタデータ行に影響するためです。

基本的な例

Subversion管理プロジェクトのトランクを追跡し、貢献する(タグとブランチは無視)

# Clone a repo (like git clone):
	git svn clone http://svn.example.com/project/trunk
# Enter the newly cloned directory:
	cd trunk
# You should be on master branch, double-check with 'git branch'
	git branch
# Do some work and commit locally to Git:
	git commit ...
# Something is committed to SVN, rebase your local changes against the
# latest changes in SVN:
	git svn rebase
# Now commit your changes (that were committed previously using Git) to SVN,
# as well as automatically updating your working HEAD:
	git svn dcommit
# Append svn:ignore and svn:global-ignores settings to the default Git exclude file:
	git svn show-ignore >> .git/info/exclude

Subversion管理プロジェクト全体を追跡し、貢献する(トランク、タグ、ブランチを含む)

# Clone a repo with standard SVN directory layout (like git clone):
	git svn clone http://svn.example.com/project --stdlayout --prefix svn/
# Or, if the repo uses a non-standard directory layout:
	git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
# View all branches and tags you have cloned:
	git branch -r
# Create a new branch in SVN
	git svn branch waldo
# Reset your master to trunk (or any other branch, replacing 'trunk'
# with the appropriate name):
	git reset --hard svn/trunk
# 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.

最初のgit svn cloneはかなりの時間を要する可能性があります(特に大規模なSubversionリポジトリの場合)。複数の人(または複数のマシンを持つ1人)が同じSubversionリポジトリと対話するためにgit svnを使用したい場合、サーバー上のリポジトリに最初のgit svn cloneを実行し、各人がgit cloneでそのリポジトリをクローンすることができます。

# Do the initial import on a server
	ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
# Clone locally - make sure the refs/remotes/ space matches the server
	mkdir project
	cd project
	git init
	git remote add origin server:/pub/project
	git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
	git fetch
# Prevent fetch/pull from remote Git server in the future,
# we only want to use git svn for future updates
	git config --remove-section remote.origin
# Create a local branch from one of the branches just fetched
	git checkout -b master FETCH_HEAD
# Initialize 'git svn' locally (be sure to use the same URL and
# --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
	git svn rebase

REBASE対PULL/MERGE

未統合のコミットをgit svnブランチと同期させるには、git pullまたはgit mergeよりもgit svn rebaseまたはgit rebaseを使用することを推奨します。そうすることで、未統合のコミットの履歴がアップストリームのSVNリポジトリに対して線形に保たれ、推奨されるgit svn dcommitサブコマンドを使用して未統合のコミットをSVNにプッシュできるようになります。

当初、git svnは開発者に対してgit svnブランチからのプルまたはマージを推奨していました。これは、作者が複数のコミットをコミットするためにgit svn set-tree A..B表記を使用するのではなく、単一のヘッドをコミットするためにgit svn set-tree Bを好んだためです。git pullまたはgit mergegit svn set-tree A..Bとともに使用すると、SVNにコミットする際に非線形履歴がフラット化され、これによりマージコミットがSVNの以前のコミットを予期せず逆転させる可能性があります。

マージの追跡

git svnは、標準レイアウトを採用するリポジトリのコピー履歴(ブランチやタグを含む)を追跡できますが、Git内で発生したマージ履歴をSVNユーザーにアップストリームに表現することはまだできません。したがって、SVNとの互換性を容易にするために、Git内で履歴を可能な限り線形に保つことが推奨されます(以下のCAVEATSセクションを参照)。

SVNブランチの処理

git svnがブランチをフェッチするように設定されており(かつ--follow-branchesが有効になっている場合)、SVNブランチごとに複数のGitブランチが作成されることがあります。この場合、追加のブランチはbranchname@nnn(nnnはSVNリビジョン番号)という形式の名前を持ちます。これらの追加のブランチは、git svnがSVNブランチの最初のコミットの親コミットを見つけられず、そのブランチを他のブランチの履歴に接続できない場合に作成されます。

通常、SVNブランチの最初のコミットはコピー操作で構成されます。git svnはこのコミットを読み取り、ブランチが作成されたSVNリビジョンを取得します。次に、このSVNリビジョンに対応するGitコミットを見つけようとし、それをブランチの親として使用します。ただし、親として機能する適切なGitコミットが存在しない可能性があります。これは、SVNブランチがgit svnによってフェッチされなかったリビジョン(例えば、--revisionでスキップされた古いリビジョンであるため)のコピーである場合や、SVNでgit svnが追跡していないディレクトリ(まったく追跡されていないブランチや、追跡されているブランチのサブディレクトリなど)がコピーされた場合などに発生します。これらの場合でも、git svnはGitブランチを作成しますが、既存のGitコミットをブランチの親として使用する代わりに、ブランチがコピーされたディレクトリのSVN履歴を読み取り、適切なGitコミットを作成します。これは「Initializing parent: <branchname>」というメッセージで示されます。

さらに、<branchname>@<SVN-Revision>という特殊なブランチが作成されます。ここで、<SVN-Revision>はブランチがコピーされたSVNリビジョン番号です。このブランチは、ブランチの新たに作成された親コミットを指します。SVNでブランチが削除され、その後別のバージョンから再作成された場合、@付きのそのようなブランチが複数存在することになります。

これは、単一のSVNリビジョンに対して複数のGitコミットが作成される可能性があることを意味することに注意してください。

例: 標準的なtrunk/tags/branchesレイアウトのSVNリポジトリで、r.100でディレクトリtrunk/subが作成されます。r.200で、trunk/subがbranches/にコピーされてブランチ化されます。git svn clone -sは、ブランチsubを作成します。また、r.100からr.199までの新しいGitコミットを作成し、これらをブランチsubの履歴として使用します。したがって、r.100からr.199までの各リビジョン(trunk/を含むものとtrunk/sub/を含むもの)には2つのGitコミットが存在することになります。最後に、ブランチsub@200が作成され、ブランチsubの新しい親コミット(すなわち、r.200とtrunk/sub/のコミット)を指します。

注意

簡潔さとSubversionとの相互運用のために、すべてのgit svnユーザーはSVNサーバーから直接クローン、フェッチ、dcommitを行い、Gitリポジトリとブランチ間のすべてのgit clone/pull/merge/push操作を避けることを推奨します。Gitブランチとユーザー間でコードを交換する推奨方法は、git format-patchgit am、または単にSVNリポジトリへの「dcommit」です。

dcommitを計画しているブランチでgit mergeまたはgit pullを実行することは推奨されません。Subversionユーザーはあなたが行ったマージを見ることができないためです。さらに、SVNブランチのミラーであるGitブランチからマージまたはプルした場合、dcommitは間違ったブランチにコミットする可能性があります。

マージを行う場合は、以下のルールに注意してください: git svn dcommitは、以下のSVNコミットの上にコミットしようとします。

git log --grep=^git-svn-id: --first-parent -1

したがって、dcommitしたいブランチの最新のコミットが、マージの最初の親であることを確認する必要があります。そうしないと、特に最初の親が同じSVNブランチの古いコミットである場合、混乱が生じます。

git cloneは、refs/remotes/階層下のブランチやgit svnのメタデータ、設定をクローンしません。したがって、git svnを使用して作成および管理されたリポジトリは、クローンを行う場合はrsyncを使用する必要があります。

dcommitは内部的にリベースを使用するため、dcommit前にgit pushするGitブランチは、リモートリポジトリ上の既存の参照を強制的に上書きする必要があります。これは一般的に悪い習慣と見なされており、詳細はgit-push[1]のドキュメントを参照してください。

すでにdcommitした変更に対して、git-commit[1]の--amendオプションを使用しないでください。他のユーザーに対してすでにプッシュしたコミットを--amendすることは悪い習慣と見なされており、SVNでのdcommitもそれと類似しています。

SVNリポジトリをクローンする際、リポジトリレイアウトを記述するオプション(--trunk、--tags、--branches、--stdlayout)が何も使用されていない場合、git svn cloneは、ブランチとタグが作業コピー内で個別のディレクトリとして表示される、完全に線形な履歴を持つGitリポジトリを作成します。これは完全なリポジトリのコピーを取得する最も簡単な方法ですが、多くのブランチを持つプロジェクトの場合、トランク単独の何倍もの作業コピーサイズになる可能性があります。したがって、標準のディレクトリ構造(trunk/branches/tags)を使用するプロジェクトの場合は、--stdlayoutオプションを使用してクローンすることをお勧めします。プロジェクトが非標準の構造を使用している場合、および/またはブランチとタグが不要な場合は、リポジトリレイアウトオプションを指定せずに1つのディレクトリ(通常はtrunk)のみをクローンするのが最も簡単です。ブランチとタグを含む完全な履歴が必要な場合は、--trunk / --branches / --tagsオプションを使用する必要があります。

複数の--branchesまたは--tagsを使用する場合、git svnは名前の衝突を自動的に処理しません(たとえば、異なるパスにある2つのブランチが同じ名前を持つ場合、またはブランチとタグが同じ名前を持つ場合など)。このような場合、initを使用してGitリポジトリを設定し、最初のfetchの前に$GIT_DIR/configファイルを編集して、ブランチとタグが異なる名前空間に関連付けられるようにしてください。例:

branches = stable/*:refs/remotes/svn/stable/*
branches = debug/*:refs/remotes/svn/debug/*

設定

git svnは、[svn-remote]設定情報をリポジトリの$GIT_DIR/configファイルに格納します。これはコアGitの[remote]セクションに似ていますが、fetchキーはグロブ引数を受け入れません。代わりに、branchestagsキーによって処理されます。一部のSVNリポジトリは、複数のプロジェクトを含む奇妙な設定になっているため、以下に示すようなグロブ展開が許可されています。

[svn-remote "project-a"]
	url = http://server.org/svn
	fetch = trunk/project-a:refs/remotes/project-a/trunk
	branches = branches/*/project-a:refs/remotes/project-a/branches/*
	branches = branches/release_*:refs/remotes/project-a/branches/release_*
	branches = branches/re*se:refs/remotes/project-a/branches/*
	tags = tags/*/project-a:refs/remotes/project-a/tags/*

ローカル参照(:の右側)の*(アスタリスク)ワイルドカードは、**最も右のパスコンポーネントでなければならない**ことに注意してください。ただし、リモートワイルドカードは、独立したパスコンポーネントである限り(/またはEOLで囲まれている限り)、どこでも構いません。このタイプの設定は、initによって自動的に作成されるものではなく、テキストエディタまたはgit configを使用して手動で入力する必要があります。

また、1単語につき1つのアスタリスクのみが許可されることに注意してください。たとえば、

branches = branches/re*se:refs/remotes/project-a/branches/*

はブランチreleaseresere123seに一致しますが、

branches = branches/re*s*e:refs/remotes/project-a/branches/*

はエラーを生成します。

中括弧内に名前をコンマ区切りでリストすることで、ブランチまたはタグのサブセットをフェッチすることも可能です。たとえば、

[svn-remote "huge-project"]
	url = http://server.org/svn
	fetch = trunk/src:refs/remotes/trunk
	branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
	tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*

複数のfetch、branches、およびtagsキーがサポートされています。

[svn-remote "messy-repo"]
	url = http://server.org/svn
	fetch = trunk/project-a:refs/remotes/project-a/trunk
	fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
	branches = branches/server/*:refs/remotes/project-a/branches/*
	branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
	tags = tags/server/*:refs/remotes/project-a/tags/*

このような設定でブランチを作成するには、-dまたは--destinationフラグを使用して、使用する場所を明確にする必要があります。

$ git svn branch -d branches/server release-2-3-0

git-svnは、ブランチまたはタグが出現した最高リビジョンを追跡していることに注意してください。フェッチ後にブランチまたはタグのサブセットが変更された場合、$GIT_DIR/svn/.metadataを手動で編集して、branches-maxRevおよび/またはtags-maxRevを適切に削除(またはリセット)する必要があります。

ファイル

$GIT_DIR/svn/**/.rev_map.*

Subversionリビジョン番号とGitコミット名の間のマッピング。noMetadataオプションが設定されていないリポジトリでは、すべてのコミットの末尾にあるgit-svn-id:行からこれを再構築できます(詳細は上記のsvn.noMetadataセクションを参照)。

git svn fetchgit svn rebaseは、rev_mapが存在しないか最新でない場合に自動的に更新します。git svn resetは自動的に巻き戻します。

バグ

svn:executable以外のすべてのSVNプロパティは無視されます。未処理のプロパティは$GIT_DIR/svn/<refname>/unhandled.logに記録されます。

名前変更されたディレクトリやコピーされたディレクトリはGitによって検出されないため、SVNへのコミット時に追跡されません。これは非常に難しく、考えられるすべてのコーナーケースで機能させるには時間がかかるため、サポートを追加する予定はありません(Git自身もこれを行いません)。名前変更されたファイルやコピーされたファイルのコミットは、Gitがそれらを検出するのに十分類似していれば完全にサポートされます。

SVNでは、タグに変更をコミットすることが可能ですが(タグは単なるディレクトリコピーであり、技術的にはブランチと同じであるため)、推奨されません。SVNリポジトリをクローンする際、git svnは将来そのようなコミットがタグに発生するかどうかを知ることができません。したがって、保守的に動作し、すべてのSVNタグをブランチとしてインポートし、タグ名の前にtags/を付けます。

関連項目

GIT

git[1]スイートの一部

scroll-to-top