履歴のあるSVNリポジトリを新しいGitリポジトリに移行するにはどうすればよいですか?


1509

私はGitのマニュアル、FAQ、Git-SVNのクラッシュコースなどを読んで、すべてこれとそれについて説明していますが、次のような簡単な説明はどこにもありません。

SVNリポジトリ: svn://myserver/path/to/svn/repos

Gitリポジトリ: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

私はそれがそれほど単純であるとは思いません、そしてそれが単一のコマンドであるとは思いません。しかし、私はそれが何かを説明しようとしないことを期待します-この例で与えられるべきどのようなステップを言うためだけに。


6
それはより簡単になり、私はそれを自分で完成させ、SO jmoses.co/2014/03/21/moving-from-svn-to-git.html
John Moses

以下のCaseyの回答を使用してください。ただし、「svn clone ...」コマンドを実行する前に、user.txtファイルに「Visual SVN Server」行を追加する方法を確認してください...ここ:stackoverflow.com/questions/8971208/ …
MacGyver 2016

1
また、GitHubプロファイルで「メールを非公開にする」オプションをオンにしている場合は、これをusers.txtのメールアドレスとして使用して一致させます。yourgituser@ users.noreply.github.comなので、実際のメールアドレスは表示されません。コミット時
MacGyver

回答:


529

マジック:

$ git svn clone http://svn/repo/here/trunk

GitとSVNの動作は大きく異なります。Gitを学ぶ必要があります。SVNアップストリームからの変更を追跡する場合は、を学ぶ必要がありますgit-svngit-svn メインページには、良い例のセクションがあります

$ git svn --help

140
@Caseyからの回答は、元の質問にはるかによく答えます。
Doug Wilson、

3
これは枝とすべてを保持しますか?またはトランクを複製するだけですか?
Eildosa 2012

7
@エイルドサ:これはトランクを複製するだけです。別の方法については、Caseyの回答を参照してください。
sleske 2013

3
@DougWilsonですが、Caseyの答えはここには表示されません。「ユーザーファイルの作成」で始まる13人の著者による以下の答えですか?
Andrey Regentov 16

68
このあたりの多くのコメントで参照されている "Casey's answer"が何か疑問に思っている人は、これがこれです(Caseyがニックネームをcmcgintyに変更しました)。
Stefan Monov 2016年

1560

users.txtSVNユーザーをGitにマッピングするためのユーザーファイル(つまり)を作成します。

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

このワンライナーを使用して、既存のSVNリポジトリからテンプレートを構築できます。

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

ファイルにないSVNユーザーが見つからない場合、SVNは停止します。しかし、その後、ファイルを更新して、中断したところから再開できます。

次に、リポジトリからSVNデータをプルします。

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

このコマンドは、新しいGitリポジトリをに作成しdest_dir-tmp、SVNリポジトリのプルを開始します。「--stdlayout」フラグは、共通の「trunk /、branchs /、tags /」SVNレイアウトがあることを意味することに注意してください。あなたのレイアウトが異なる場合は、に慣れ--tags--branches--trunk(一般的にはオプションgit svn help)。

すべての一般的なプロトコルが許可されています:svn://http://https://。URLは、http://svn.mycompany.com/myrepo/repositoryのようなベースリポジトリをターゲットにする必要があります。URL文字列には、またはを含めることはできませ/trunk/tag/branches

このコマンドを実行した後、操作が「ハング/フリーズ」しているように見えることがよくあります。新しいリポジトリを初期化した後、長時間停止することはごく普通のことです。最終的には、移行中であることを示すログメッセージが表示されます。

また、--no-metadataフラグを省略すると、Gitは対応するSVNリビジョンに関する情報をコミットメッセージに追加します(つまりgit-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>

ユーザー名が見つからない場合は、users.txtファイルを更新します。

cd dest_dir-tmp
git svn fetch

大規模なプロジェクトの場合は、Subversionのコミットがすべてフェッチされるまで、最後のコマンドを数回繰り返す必要がある場合があります。

git svn fetch

完了すると、GitはSVN trunkを新しいブランチにチェックアウトします。他のブランチはすべてリモートとしてセットアップされます。他のSVNブランチを表示するには、次のようにします。

git branch -r

リポジトリに他のリモートブランチを保持する場合は、各ブランチのローカルブランチを手動で作成します。(トランク/マスターをスキップします。)これを行わないと、最後のステップでブランチが複製されません。

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

タグはブランチとしてインポートされます。ローカルブランチを作成し、タグを作成し、ブランチを削除して、それらをGitのタグとして持つ必要があります。タグ「v1」でそれを行うには:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

GIT-SVNリポジトリをクリーンなGitリポジトリに複製します。

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

以前にリモートブランチから作成したローカルブランチは、リモートブランチとしてのみ、新しいクローンリポジトリにコピーされます。(トランク/マスターをスキップします。)保持したいブランチごとに:

git checkout -b local_branch origin/remote_branch

最後に、削除された一時リポジトリを指すクリーンなGitリポジトリからリモートを削除します。

git remote rm origin

36
Eelkeによるこのブログ投稿は、上記の回答に対する優れた相互参照です。blokspeed.net/blog/2010/09/converting-from-subversion-to-git
kgriffs

4
これは99%素晴らしいです。次の手順に従って、ブランチを除くすべてを順番に取得しました。最後の手順の後、リモートのみでした(そして、コマンドgit remote rm originを実行すると、そのように消えました)
Dirty Henry

4
GitHubには非常に便利なステップバイステップがあります:github.com/nirvdrum/svn2git#readme
Dan

8
Windowsの場合、この方法に基づいてPowerShellスクリプトを作成しました:gist.github.com/Gimly/90df046dc38181bb18de
Gimly

5
多くの履歴を持つ大規模なリポジトリに対する警告、これは遅くて退屈です。私はすべての古いブランチを移行しようとあきらめ、トランクを単に移行しました。
ジェス

195

SubversionリポジトリをGitリポジトリにクリーンに移行します。まず、Subversionコミットの作成者名をGitコミッターにマップするファイルを作成する必要があります~/authors.txt

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

次に、SubversionデータをGitリポジトリにダウンロードできます。

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Macを使用している場合はgit-svn、MacPortsからをインストールして取得できますgit-core +svn

subversionリポジトリが目的のgitリポジトリと同じマシンにある場合は、この構文をinitステップに使用できます。それ以外はすべて同じです。

git svn init file:///home/user/repoName --no-metadata

1
他の回答についてコメントしたところ、インポートが中止されて空のリポジトリーが取得さ=れたusers.txtため、周りのスペースを削除する必要がありました。
セバスティアンGrignoli

8
ああ!シンプルで効果的な説明。私の場合file:///、仕事を拒否し、代わりにsvnserve.exe --daemon使用しsvn://localhost/home/user/repoました。
Daniel Reis

Mountain Lionを実行しているMacでは、Xcodeにアクセスして、[設定]ペインの[ダウンロード]タブにあるコマンドラインツールをインストールするまで、git svnは機能しませんでした。あるいは、Appleの開発者サイトにあるOS X Mountain Lionのコマンドラインツールだけをインストールすることもできます。
ドリュー

3
私の場合、ファイルauthors.txtをに変換する必要がありましたutf-8 without BOM
Silvan 2015年

これは私にとってはうまくいきました!私はローカルリポジトリを持っていたら、私はで始まるcmcgintyのポストを使用した「クリーンなGitのリポジトリにクローンあなたのGIT-SVNリポジトリを:」私は私が答えだった@zoulさんが言っていた主な理由は、の使用であると考えgit svn initgit svn config最終的にgit svn fetchそれは簡単だったとしてこのようにするには、正しく取得するために数回フェッチする必要がありました。git svn clone3つすべてを実行するcmcgintyの単一行は 、私にとって混乱しすぎていました。
マイク

70

私はsvn2gitスクリプトを使用して、魅力のように動作しました。


4
Q:これはタグとブランチ名のスペースを修正しますか(svnでは許可され、gitでは許可されません)?
spazm


これは私にとって問題で失敗しました:groups.google.com/forum /# !topic / msysgit / 7MQVwRO - 2N4-も参照してください:github.com/nirvdrum/svn2git/issues/50 解決策はここにありました: stackoverflow.com/questions / 3009738 /…
HDave

答えを説明することをお勧めします。それ以外の場合は、スクリプトキディを作成します。
Josh Habdas 2017年

ブランチがすべてSVNのルートにあり、トランクやタグがない場合はどうでしょうか?
Kal

58

git-svnを常に使用する前に、Gitに慣れることをお勧めします。つまり、SVNを集中リポジトリとして維持し、Gitをローカルで使用します。

ただし、すべての履歴を持つ単純な移行の場合、いくつかの簡単な手順を次に示します。

ローカルリポジトリを初期化します。

mkdir project
cd project
git svn init http://svn.url

リビジョンのインポートを開始するまでの期間をマークします。

git svn fetch -r42

(またはすべてのリビジョンについては単に「git svn fetch」)

それ以降、実際にすべてをフェッチします。

git svn rebase

インポートの結果はGitkで確認できます。これがWindowsで機能するかどうかはわかりませんが、OSXとLinuxで機能します。

gitk

SVNリポジトリをローカルで複製したら、それを集中型Gitリポジトリにプッシュして、コラボレーションを容易にすることができます。

最初に空のリモートリポジトリを作成します(おそらくGitHubにありますか?):

git remote add origin git@github.com:user/project-name.git

次に、オプションでメインブランチを同期して、プル操作でリモートマスターとローカルマスターが自動的にマージされるようにします。

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

その後、git_remote_branchリモートブランチの処理に役立つ独自のツールを試してみることに興味を持つかもしれません。

最初の説明記事:「Gitリモートブランチ

最新バージョンのフォローアップ:「Gitがgit_remote_branchと共同作業する時間


非常に役に立ち、これは完璧に機能しました。リモートリポジトリに同期する場合は、最後のステップが1つあることを付け加えておきます。gitの構成手順の後で、私はgit push origin master
mag382

31

SubversionからGitへのスムーズな移行のための(または両方を同時に使用するための)新しいソリューションがあります。SubGitです。

私自身、このプロジェクトに取り組んでいます。私たちはリポジトリでSubGitを使用しています。私のチームメイトの一部はGitと一部のSubversionを使用しており、これまでのところ非常にうまく機能しています。

SubGitを使用してSubversionからGitに移行するには、次を実行する必要があります。

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

その後、svn_repos / .gitにGitリポジトリーを取得してそれを複製するか、Subversionとこの新しいGitリポジトリーを一緒に使用し続けることができます。SubGitは両方が常に同期していることを確認します。

Subversionリポジトリに複数のプロジェクトが含まれている場合、複数のGitリポジトリがsvn_repos / gitディレクトリに作成されます。実行する前に翻訳をカスタマイズするには、次のようにします。

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

ではSubGitあなたは純粋なGitリポジトリ(ないのgit - SVN)に移行し、あなたがそれを必要としてまだ(あなたの既に設定ビルドツールのインスタンスのために、)longとしてSubversionを維持しながら、それを使用して起動することがあります。

お役に立てれば!


4
subgit importコマンドを使用した)1回限りのインポートでは、ライセンスも必要ないようです。svn:ignoreプロパティの.gitignoreファイルへの正確な変換も含まれています。
krlmlr 2015年

1
SubGitは私の秘密鍵も、コマンドラインで設定したフラグも認識しません。ドキュメントは非常に貧弱です。これはの実行可能な代替方法ではありませんgit svn
pfnuesel 2015年

1
エラー:「svn_repos」は有効な構成場所ではありません。SubGit構成ファイルがありません。
Jon Davis

19

公式のgit-svnマンページを参照してください。特に、「基本的な例」をご覧ください。

Subversionが管理するプロジェクト全体(トランク、タグ、ブランチを完備)の追跡と貢献:

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

あなたのクローンコマンドは機能しました、上記のものは私に空のgitリポジトリしか与えませんでした。唯一の違いは、明示的な「-Tトランク」のようです。
user1984717


14

SubGit対死のブルースクリーン)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

それがすべてです。

+ SVNから更新するには、最初のコマンドで作成されたGitリポジトリ。

subgit import  directory/path/Local.git.Repo

私は巨大なリポジトリのためにGitに即座に移行する方法を使用しました。
もちろん準備が必要です。
しかし、開発プロセスをまったく止めることはできません。

これが私のやり方です。

私の解決策は次のようになります:

  • SVNをGitリポジトリに移行する
  • チームがに切り替える直前にGitリポジトリを更新します

大きなSVNリポジトリの場合、移行には多くの時間がかかります。
しかし、完了した移行の更新はわずか数秒です。

もちろん、私はSubGit、ママを使用しています。git-svnを使用すると、ブルースクリーンが表示されます。絶えず。そして、git-svnはGitの「ファイル名が長すぎます」という致命的なエラーで退屈です。

手順

1. SubGitをダウンロードする

2.移行および更新コマンドを準備します。

Windowsでそれを行うとしましょう(Linuxに移植するのは簡単です)。
SubGitのインストールbinディレクトリ(subgit-2.XX \ bin)で、2つの.batファイルを作成します。

移行用のファイル/コマンドの内容:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

"start"コマンドはここではオプションです(Windows)。起動時にエラーを確認し、SubGitの完了後にシェルを開いたままにすることができます。

ここにgit-svnのような追加のパラメーターを追加できます。--default-domain myCompanyDomain.comのみを使用して、SVN作成者のメールアドレスのドメインを修正しています。
標準のSVNリポジトリの構造(トランク/ブランチ/タグ)があり、「作成者のマッピング」に問題はありませんでした。だから私はもう何もしていません。

(ブランチなどのタグを移行する場合、またはSVNに複数のブランチ/タグフォルダーがある場合は、より詳細なSubGit アプローチの使用を検討してください)

ヒント1:--minimal-revision YourSvnRevNumberを使用して、問題がどのように発生するかをすばやく確認します(ある種のデバッグ)。特に役立つのは、解決された作成者名または電子メールを表示することです。
または、移行履歴の深さを制限します。

ヒント2:次の更新コマンド/ファイルを実行すると、移行が中断され(Ctrl+ C)、復元される場合があります。
大きなリポジトリに対してこれを行うことはお勧めしません。「メモリ不足Java + Windows例外」を受け取りました。

ヒント3:結果のベアリポジトリのコピーを作成することをお勧めします。

更新するファイル/コマンドの内容:

start    subgit import  directory/path/Local.git.Repo

Gitリポジトリへの最後のチームのコミットを取得したい場合は、何度でも実行できます。

警告!ベアリポジトリ(ブランチの作成など)には触れないでください。
次の致命的なエラーが発生します。

回復不可能なエラー:同期しておらず、同期できません... SubversionリビジョンをGitコミットに変換しています...

3。最初のコマンド/ファイルを実行します。大きなリポジトリを作成するには、かなり時間がかかります。私のささやかなリポジトリのために30時間。

それがすべてです。
2番目のファイル/コマンドを実行することで、いつでもSVNからGitリポジトリをいつでも更新できます。そして、開発チームをGitに切り替える前。
ほんの数秒で終わります。



もう1つ便利なタスクがあります。

ローカルGitリポジトリをリモートGitリポジトリにプッシュする

それはあなたのケースですか?先に進みましょう。

  1. リモコンを設定する

実行:

$ git remote add origin url://your/repo.git
  1. 巨大なローカルGitリポジトリをリモートリポジトリに最初に送信する準備をする

デフォルトでは、Gitは大きなチャンクを送信できません。 致命的:リモートエンドが突然ハングアップした

実行してみましょう:

git config --global http.postBuffer 1073741824

524288000-500 MB 1073741824-1 GBなど

ローカル証明書の問題を修正します。git-serverが壊れた証明書を使用している場合。

証明書を無効にしました。

また、Gitサーバーには、修正が必要なリクエスト量の制限がある場合があります。

  1. すべての移行をチームのリモートGitリポジトリにプッシュします。

ローカルGitで実行します。

git push origin --mirror

(古いGitバージョンのgit push origin '*:*'

次のエラーが発生した場合:エラー:gitを生成できません:そのようなファイルまたはディレクトリはありません ...私にとって、リポジトリを完全に再作成すると、このエラー(30時間)が解決します。次のコマンドを試すことができます

git push origin --all
git push origin --tags

または、Git再インストールしてみてください(私には役に立たない)。または、すべてのタグからブランチを作成してプッシュすることもできます。または、または、または...


10

リポサージョン

複雑なケースでは、Eric S. Raymondによる再ポスポジョンが最適なツールです。SVNに加えて、fast-exportフォーマットを介して他の多くのバージョン管理システムとCVSもサポートしています。著者は、EmacsFreeBSDなどの古代リポジトリの変換が成功したと報告しています

このツールは明らかに、長い歴史を持つ困難なリポジトリレイアウトでも、ほぼ完全な変換(SVNのsvn:ignoreプロパティを.gitignoreファイルに変換するなど)を目的としています。多くの場合、他のツールの方が使いやすいかもしれません。

reposurgeonコマンドラインのドキュメントを掘り下げる前に、変換プロセスを段階的に説明する優れたDVCS移行ガイドを必ずお読みください。


8

アトラシアンのWebサイトにあるこのガイドは、私が見つけた最高のガイドの1つです。

https://www.atlassian.com/git/migration

このツール(https://bitbucket.org/atlassian/svn-migration-scripts)は、とりわけauthors.txtを生成するのにも非常に役立ちます。


このページは素晴らしいです、そして私見は最良の答えです!それはあなたのためにうなり声の仕事のほとんどをします。
PfunnyGuy

8

インストールする必要があります

git
git-svn

このリンクからコピーhttp://john.albin.net/git/convert-subversion-to-git

1.すべてのSubversionコミッターのリストを取得する

Subversionは、コミットごとにユーザー名をリストするだけです。Gitのコミットにははるかに豊富なデータがありますが、最も単純な場合、コミットの作成者は名前と電子メールをリストする必要があります。デフォルトでは、git-svnツールは作成者と電子メールの両方のフィールドにSVNユーザー名をリストするだけです。しかし、少しの作業で、すべてのSVNユーザーのリストと、対応するGit名と電子メールが何であるかを作成できます。このリストをgit-svnで使用すると、プレーンなsvnユーザー名を適切なGitコミッターに変換できます。

ローカルSubversionチェックアウトのルートから、次のコマンドを実行します。

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

これにより、すべてのログメッセージが取得され、ユーザー名が抽出され、重複するユーザー名が削除され、ユーザー名が並べ替えられて、「authors-transform.txt」ファイルに配置されます。次に、ファイルの各行を編集します。たとえば、次のように変換します。

jwilkins = jwilkins <jwilkins>

これに:

jwilkins = John Albin Wilkins <johnalbin@example.com>

2. git-svnを使用してSubversionリポジトリのクローンを作成します

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

これにより、標準のgit-svn変換が行われ(手順1で作成したauthors-transform.txtファイルを使用)、gitリポジトリがホームディレクトリ内の「〜/ temp」フォルダーに配置されます。

3. svn:ignoreプロパティを.gitignoreに変換します

svn repoがsvn:ignoreプロパティを使用していた場合、これを.gitignoreファイルに簡単に変換できます:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4.リポジトリを最小限のgitリポジトリにプッシュする

最初に、ベアリポジトリを作成し、そのデフォルトブランチをsvnの「トランク」ブランチ名に一致させます。

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

次に、一時リポジトリを新しいベアリポジトリにプッシュします。

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

〜/ tempリポジトリを安全に削除できるようになりました。

5.「trunk」ブランチの名前を「master」に変更します

メインの開発ブランチの名前は「trunk」になり、Subversionでの名前と同じになります。次のコマンドを使用して、Gitの標準の「マスター」ブランチに名前を変更する必要があります。

cd ~/new-bare.git
git branch -m trunk master

6.ブランチとタグをクリーンアップする

git-svnは、すべてのSubversionsタグを「tags / name」という形式のGitの非常に短いブランチにします。次のコマンドを使用して、これらのすべてのブランチを実際のGitタグに変換する必要があります。

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

このステップでは、少しタイプする必要があります。:-)しかし、心配しないでください。UNIXシェルは、git for-each-refで始まるextra-longコマンドの>セカンダリプロンプトを提供します。


7

GitHubにSVNリポジトリからインポートする機能が追加されました。私はそれを試したことはありません。


3
GitHubの現在の推奨事項svn2git別の回答で提案されているプログラムを使用することです。
ntc2 2014年

2つの非常に大きなプロジェクトを今すぐ完璧にインポートしました。すべてのSVNブランチがインポートされました(リポジトリパスで\ trunkパーツを使用しないことを覚えておいてください)。私がまだ知らないことの1つは、Githubが新しいコミットを追跡するかどうかです。
Fr0sT 2014

7

git、SVN、およびbashだけを使用した、やや拡張された回答。これには、trunk / branches / tagsディレクトリレイアウトで従来のレイアウトを使用しないSVNリポジトリの手順が含まれています(SVNはこの種類のレイアウトを強制するためにまったく何もしません)。

最初にこのbashスクリプトを使用して、貢献したさまざまな人々のSVNリポジトリをスキャンし、マッピングファイルのテンプレートを生成します。

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

これを使用して、authorssvnユーザー名をユーザー名にマッピングするファイルを作成し、git configプロパティuser.nameを使用して開発者が設定したメールを送信しますuser.email(GitHubのようなサービスの場合、一致するメールのみで十分です)。

次にgit svn、svnリポジトリをgitリポジトリに複製して、マッピングについて伝えます。

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

git svnは存在するすべてのタグまたはブランチのすべてのリビジョンを個別にチェックアウトするため、これには信じられないほど長い時間がかかる場合があります。(SVNのタグは実際にはブランチなので、Gitのようになってしまうことに注意してください)。不要なSVNの古いタグとブランチを削除することで、これを高速化できます。

同じネットワーク内のサーバーまたは同じサーバー上でこれを実行すると、実際にこれを高速化できます。また、何らかの理由でこのプロセスが中断された場合は、次のコマンドを使用して再開できます

git svn rebase --continue

多くの場合、ここで行われます。しかし、SVNリポジトリに、SVNにディレクトリがあり、gitブランチに配置したいという型破りなレイアウトの場合は、いくつかの追加手順を実行できます。

最も簡単なのは、サーバーに新しいSVNリポジトリを作成することです。これは、規則に従ってsvn copy、ディレクトリをトランクまたはブランチに配置するために使用します。私が最後にこれを試したとき、ディレクトリがリポジトリのルートにある場合、これが唯一の方法かもしれませんgit svn単にチェックアウトを拒否しただけです。

gitを使用してこれを行うこともできます。ためにgit svn clone単にあなたがgitのブランチに置くことをしたいディレクトリを使用します。

実行後

git branch --set-upstream master git-svn
git svn rebase

これにはGit 1.7以降が必要であることに注意してください。


私は、このリンクでこの情報を結合することを提案します:sailmaker.co.uk/blog/2013/05/05/...
ジョーンPS

7

ステップバイステップガイドを投稿しました(ここにsvnタグをgitタグに、svnブランチをgitブランチに変換することを含め、svnをgitに変換するための)を。

短縮版:

1)特定のリビジョン番号からsvnを複製します。(リビジョン番号は、移行する最も古いものである必要があります)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2)SVNデータをフェッチします。このステップは、最も時間がかかるステップです。

cd gitreponame
git svn fetch

エラーなしで終了するまでgit svn fetchを繰り返します

3)masterブランチを更新する

git svn rebase

4)参照をコピーしてsvnブランチからローカルブランチを作成します

cp .git/refs/remotes/origin/* .git/refs/heads/

5)svnタグをgitタグに変換する

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6)githubのようなより良い場所にリポジトリを置く

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

詳細については、私の投稿を読むか、私に尋ねてください。


6

git svn clone以下のようにコマンドを使用できます。

  • svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

上記のコマンドは、SVNコミットから作成者ファイルを作成します。

  • svn log --stop-on-copy <SVN_URL>

上記のコマンドは、SVNプロジェクトが作成されたときの最初のリビジョン番号を示します。

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

上記のコマンドは、ローカルにGitリポジトリを作成します。

問題は、ブランチとタグをプッシュに変換しないことです。手動で行う必要があります。ブランチの例を次に示します。

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

タグの場合:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

マスター、ブランチ、タグをリモートgitリポジトリにプッシュします。

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

svn2gitユーティリティ

svn2gitユーティリティは、ブランチとタグによる手動の作業を削除します。

コマンドを使用してインストールしますsudo gem install svn2git。その後、以下のコマンドを実行します。

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

これで、ブランチ、タグをリストして、簡単にプッシュできます。

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

あなたが20のブランチとタグを持っていると想像してください、明らかにsvn2gitはあなたに多くの時間を節約します、そしてそれが私がネイティブコマンドよりもそれを好む理由です。これは、ネイティブgit svn cloneコマンドの優れたラッパーです。

完全な例については、私のブログエントリを参照してください。




3

SourceTreeを使用している場合は、アプリから直接行うことができます。Goto File-> New / Cloneそして次のようにします:

  1. 「ソースパス/ URL」としてリモートSVN URLを入力します。
  2. プロンプトが表示されたら、資格情報を入力します。
  3. ローカルフォルダの場所を「宛先パス」として入力します。
  4. 名前を付けます。
  5. 詳細オプションで、「タイプのローカルリポジトリを作成」のドロップダウンから「Git」を選択します。
  6. 必要に応じて、クローン元のリビジョンを指定できます。
  7. クローンをヒットします。

SourceTreeでリポジトリを開くと、コミットメッセージも移行されていることがわかります。

次に、[リポジトリ]-> [リポジトリ設定]に移動し、新しいリモートリポジトリの詳細を追加します。必要に応じてSVNリモートを削除します(「構成ファイルの編集」オプションを使用してこれを行いました)。

準備ができて自由にコーディングできるようになったら、コードを新しいリモートリポジトリにプッシュします。


とても簡単で早くありがとうございます!
リカルド2014年

ありがとうございます。これでうまくいきました。SourceTreeとStashを使用しています。
VK_217 2015年

3

GitLabのユーザー私はここにSVNからの移行方法についての要点を設置しました:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

SVNからGitLabに移行する手順

セットアップ

  • SVNはでホストされていsvn.domain.com.auます。
  • SVNは経由でアクセスできますhttp(他のプロトコルが機能するはずです)。
  • GitLabは次の場所でホストされgit.domain.com.auています。
    • 名前空間を使用してグループが作成されますdev-team
    • 少なくとも1つのユーザーアカウントが作成され、グループに追加され、移行に使用されるアカウントのSSHキーを持っています(を使用したテストssh git@git.domain.com.au)。
    • プロジェクトfavourite-projectdev-team名前空間に作成されます。
  • ファイルにusers.txtは、関連するユーザーの詳細が1行に1人の形式で含まれていますusername = First Last <address@domain.com.au>。ここusernameで、はSVNログで指定されたユーザー名です。(詳細については、「参照」セクションの最初のリンク、特にユーザーCaseyによる回答を参照してください)。

バージョン

  • subversionバージョン1.6.17(r1128011)
  • gitバージョン1.9.1
  • GitLabバージョン7.2.1 ff1633f
  • Ubuntuサーバー14.04

コマンド

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

それでおしまい!GitLabウェブUIでプロジェクトページを再読み込みすると、すべてのコミットとファイルが一覧表示されます。

ノート

  • 未知のユーザが存在する場合、git svn cloneコマンドは、その場合、更新には、停止しますusers.txtcd favourite-projectそしてgit svn fetch、それが停止した場所から続行されます。
  • 標準trunk- tags- branchesSVNリポジトリのレイアウトが必要です。
  • 与えられたSVN URL git svn cloneコマンドは、すぐ上のレベルで停止しtrunk/tags/そしてbranches/
  • このgit svn cloneコマンドは、上部の警告を含む多くの出力を生成します。警告は無視しました。

このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
ブラックホール

1
同意しません。リンクされたコンテンツは変更される可能性があり、ここで複製されたコンテンツは更新されないため、古くなっている可能性があります(実際、私が最初にこの回答を投稿してから変更されていると思います)。ガイドラインは、リンクに関連するコンテキストを含めることだけを述べていますが、実際の質問はリンクによって大まかに回答されました。ここでリンクされたリソース全体をコピーする必要はありません。私はこれに反対票を投じましたか?!
leftclickben

2

別の側面として、git-svn dcommitsを使用してgitを実行しようとすると、git-stashコマンドは天の恵みです。

典型的なプロセス:

  1. git repoを設定する
  2. 別のファイルでいくつかの作業を行う
  3. gitを使用して、作業の一部をチェックすることにします
  4. 決める svn-dcommit
  5. 恐ろしい「ダーティインデックスでコミットできない」エラーが発生します。

ソリューション(git 1.5.3+が必要):

git stash; git svn dcommit ; git stash apply

2

1つ以上のSVNリポジトリをgitに変換してGitHubにプッシュする、依存関係のない単純なシェルスクリプトを次に示します。

https://gist.github.com/NathanSweet/7327535

約30行のスクリプトit:git SVNを使用してクローンを作成し、SVN :: ignoreプロパティから.gitignoreファイルを作成し、裸のgitリポジトリにプッシュし、SVNトランクの名前をマスターに変更し、SVNタグをgitタグに変換して、GitHubにプッシュしますタグを保持しながら。

私は多くの苦労を経て、ダースのSVNリポジトリをGoogle CodeからGitHubに移動しました。私がWindowsを使用したことは助けにはなりませんでした。Rubyは私の古いDebianボックスですべて壊れていて、Windowsで動作させるのは冗談でした。他のソリューションはCygwinパスで機能しませんでした。いったん機能したとしても、GitHubにタグを表示する方法を理解できませんでした(秘密は--follow-tagsです)。

結局、上にリンクされた2つの短くて単純なスクリプトを組み合わせたところ、うまく機能しました。ソリューションはそれ以上複雑である必要はありません!


2
このスクリプトを使用しました。少し試行錯誤を繰り返した結果、うまくいきました。--follow-tagsはそれ以降のみサポートされているため、これにはGit 1.8.3以降が必要です。
nrobey 2014

2

私はWindowsマシンで、小さなバッチを作成し、履歴を含む(ただしブランチは含まない)SVNリポジトリをGITリポジトリに転送します。

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

たぶん、だれでもそれを使うことができます。TMPフォルダーが作成され、gitを使用してSVNリポジトリがチェックアウトされ、新しいオリジンが追加されてプッシュされます...フォルダーを再度削除します。

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

あなたはまだあなたのようなユーザーマッピングを持つusers.txtが必要です

User1 = User One <u.1@xxx.com>

この回答は、すべてのリポジトリを問題なくBitBucketに移動するのに役立ちました。
ゴンザリンギ

聞いてうれしい。私はGiteaでの経験しかありませんでした...しかし、~~ 40のリポジトリをこの方法で転送しました。
cljk

非常に素晴らしい!Thnx
b3wii

警告; 文字セットの問題が発生しました。本当に手遅れだと認識しましたが、修正に数時間かかりました。結果のリポジトリに正確な(!)期待されるソースが含まれていることを確認してください
cljk

1

私の貢献をGitコミュニティに追加したかっただけです。完全なインポートを自動化する単純なbashスクリプトを作成しました。他の移行ツールとは異なり、このツールはjGitではなくネイティブgitに依存しています。このツールは、大きな変更履歴や大きなブロブを持つリポジトリもサポートします。githubから入手できます:

https://github.com/onepremise/SGMS

このスクリプトは、SVNに保存されているプロジェクトを次の形式で変換します。

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

このスキームも人気があり、サポートされています。

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

各プロジェクトはプロジェクト名で同期されます。

Ex: ./migration https://svnurl.com/basepath project1

リポジトリ全体を変換する場合は、次の構文を使用します。

Ex: ./migration https://svnurl.com/basepath .

0

Subversion Gitを効果的に使用することは、git-svnの穏やかな紹介です。既存のSVNリポジトリーの場合、git-svnはこれを非常に簡単にします。新しいリポジトリを開始する場合は、最初に空のSVNリポジトリを作成してからgit-svnを使用してインポートする方が、反対の方向に進むよりもはるかに簡単です。新しいGitリポジトリを作成してからSVNにインポートすることもできますが、特にGitを初めて使用し、コミット履歴を保持したい場合は、少し面倒です。


0

Windows用のRubyインストーラーをダウンロードし、それを使用して最新バージョンをインストールします。Ruby実行可能ファイルをパスに追加します。

  • svn2gitをインストールする
  • スタートメニュー->すべてのプログラム-> Ruby-> Rubyでコマンドプロンプトを起動
  • 次に、「gem install svn2git」と入力して、次のように入力します。

    Subversionリポジトリを移行する

  • Rubyコマンドプロンプトを開き、ファイルを移行するディレクトリに移動します。

    次にsvn2git http:// [ドメイン名] / svn / [リポジトリルート]

  • プロジェクトをGitに移行するには数時間かかる場合があります。プロジェクトのコードサイズによって異なります。

  • この主要なステップは、以下で説明するGitリポジトリー構造の作成に役立ちます。

    SVN(/ Project_components)トランク-> GitマスターSVN(/ Project_components)ブランチ-> GitブランチSVN(/ Project_components)タグ-> Gitタグ

リモートリポジトリを作成し、変更をプッシュします。


0

GitHubにはインポーターがあります。リポジトリを作成したら、そのURLを使用して既存のリポジトリからインポートできます。該当する場合は資格情報を要求し、そこから移動します。

実行中は作者を見つけ、GitHub上のユーザーに簡単にマッピングできます。

私は現在、いくつかのリポジトリで使用していますが、かなり正確で、はるかに高速です!リポジトリが約4000コミットの場合、10分かかりました。その後、友人が4日かかりました。


0

ここでいくつかの回答はhttps://github.com/nirvdrum/svn2gitを参照していますが、大規模なリポジトリの場合、これが遅くなる可能性があります。https://github.com/svn-all-fast-export/svn2gitを使用してみました代わりにたが、これはまったく同じ名前のツールですが、KDEをSVNからGitに移行するために使用されていました。

設定には少し手間がかかりますが、変換が完了すると数分かかりましたが、他のスクリプトでは何時間もかかっていました。


0

この目標を達成する方法はいくつかあります。私はそれらのいくつかを試してみましたが、Windows OSにgitとsvnをインストールするだけで実際に機能するものを見つけました。

前提条件:

  1. git on windows(私はこれを使用しました)https://git-scm.com/
  2. コンソールツールがインストールされたsvn(私は亀のsvnを使用しました)
  3. SVNリポジトリのダンプファイル。 svnadmin dump /path/to/repository > repo_name.svn_dump

最終目標を達成するための手順(履歴のあるすべてのリポジトリをgitに移動します。最初にローカルgit、次にリモートに移動します)

  1. 空のリポジトリを(コンソールツールまたはtortoiseSVNを使用して)ディレクトリREPO_NAME_FOLDERに作成しcd REPO_NAME_PARENT_FOLDER、dumpfile.dumpをREPO_NAME_PARENT_FOLDER に配置します

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump この操作をお待ちください。時間がかかる場合があります

  3. このコマンドはサイレントなので、2番目のcmdウィンドウを開きます。svnserve -d -R --root REPO_NAME_FOLDER なぜfile:/// ......を使用しないのですか?Unable to open ... to URL:回答のおかげで、次のコマンドはで失敗しますhttps://stackoverflow.com/a/6300968/4953065

  4. 新しいフォルダSOURCE_GIT_FOLDERを作成します

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn:// localhost /この操作を待ちます。

最後に、何を手に入れましたか?

ローカルリポジトリを確認してみましょう:

git log

以前のコミットを確認しますか?はいの場合-大丈夫

これで、ソースと古いsvn履歴を含む完全に機能するローカルgitリポジトリができました。これをサーバーに移動する場合は、次のコマンドを使用します。

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

私の場合、タグコマンドが必要ないので、リポジトリにタグがありません。

幸運を!


0

svnサブモジュール/フォルダー 'MyModule'を、タグもブランチもない履歴のあるgitに変換します。

SVN無視リストを保持するには、ステップ1の後に上記のコメントを使用してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.