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

StackOverflow https://stackoverflow.com/questions/79165

質問

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

私はそれがそれほど単純であるとは予想していませんし、単一のコマンドであるとも予想していません。しかし、私はそれが何かを説明しようとするものではなく、単にこの例を踏まえてどのようなステップをとるべきかを述べるだけであることを期待しています。

役に立ちましたか?

解決

魔法:

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

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

$ git svn --help

他のヒント

ユーザーファイルを作成します(つまり、 users.txt) SVN ユーザーを 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/、branch/、tags/」SVN レイアウトがあることを意味することに注意してください。レイアウトが異なる場合は、よく理解してください。 --tags, --branches, --trunk オプション(一般的には git svn help).

すべての一般的なプロトコルが許可されます。 svn://, http://, https://. 。URL は次のようなベース リポジトリをターゲットにする必要があります。 http://svn.mycompany.com/myrepo/repository. 。そうでなければなりません ない 含む /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

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

私が使用したのは、 svn2git スクリプト そして魅力的に機能します。

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

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

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

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

どのくらい遡ってリビジョンのインポートを開始するかをマークします。

git svn fetch -r42

(またはすべての Rev に対して単に「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_remote_branch と git コラボレーションする時間です"

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

私自身もこのプロジェクトに取り組んでいます。私たちはリポジトリで 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

サブGit 純粋な Git (git-svn ではない) に移行し、必要な限り (たとえば、構成済みのビルド ツールの場合) Subversion を維持したまま、その使用を開始できます。

お役に立てれば!

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

Subversionが管理するプロジェクト全体を追跡し、貢献します(トランク、タグ、ブランチを備えています):

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

Pro Git 8.2 では次のように説明されています。http://git-scm.com/book/en/Git-and-Other-Systems-Migrated-to-Git

サブGit (vs ブルー スクリーン オブ デス)

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 リポジトリの移行には時間がかかります。
ただし、完了した移行の更新はわずか数秒です。

もちろん使ってます サブGit, 、 ママ。git-svn は私を作ります 死のブルースクリーン. 。ただ常に。そして、git-svn は Git のことにうんざりしています。」ファイル名が長すぎます" 致命的な誤り。

ステップ

1. SubGitをダウンロード

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

これを Windows で行うとしましょう (Linux に移植するのは簡単です)。
SubGit のインストール内 置き場 ディレクトリ (subgit-2.X.X\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 サーバーが壊れた証明書を使用している場合。

無効にしました 証明書.

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

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

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

git push origin --mirror

(git プッシュ オリジン '*:*' 古い Git バージョンの場合)

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

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

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

再手術外科医

複雑な症例の場合は再手術を行います。 エリック S.レイモンド が最適なツールです。SVN に加えて、他の多くのバージョン管理システムもサポートしています。 fast-export フォーマット、そしてまた CVS. 。著者は、次のような古代リポジトリの変換に成功したと報告しています。 Emacs そして FreeBSD.

どうやらツールは ほぼ完璧な変換を目指します (SVN の変換など) svn:ignore プロパティを .gitignore ファイル)、長い歴史を持つ困難なリポジトリ レイアウトであっても。多くの場合、他のツールの方が使いやすい場合があります。

のドキュメントを詳しく調べる前に、 reposurgeon コマンドラインについては、必ず読んでください。 DVCS 移行ガイド 変換プロセスを段階的に説明します。

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

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

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

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

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 ファイルを使用)、ホーム ディレクトリ内の「~/temp」フォルダーに git リポジトリが配置されます。

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

svn リポジトリが 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 の「trunk」ブランチ名と一致させます。

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」に変更します

メインの開発ブランチには、Subversion での名前と一致する「trunk」という名前が付けられます。以下を使用して、Git の標準の「master」ブランチに名前を変更します。

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

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

git-svn は、すべての Subversion タグを Git 内の「タグ/名前」という形式の非常に短いブランチにします。以下を使用して、これらすべてのブランチを実際の G​​it タグに変換するとよいでしょう。

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 で始まる非常に長いコマンドに対して > 二次プロンプトを提供します。

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

git、SVN、bash のみを使用した、やや拡張された回答。これには、トランク/ブランチ/タグ ディレクトリ レイアウトによる従来のレイアウトを使用しない 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

これを使用して、 authors svn ユーザー名を、開発者が設定したユーザー名と電子メールにマッピングするファイル。 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 以降が必要であることに注意してください。

ステップバイステップガイドを投稿しました(ここ) 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

さらに詳しく知りたい場合は、私の記事を読んでください 役職 または私に聞いてください。

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

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

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

  • 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 を使用すると時間を大幅に節約できます。それが、私がネイティブ コマンドよりも svn2git の方が気に入っている理由です。ネイティブの素晴らしいラッパーです git svn clone 指示。

完全な例については、私の記事を参照してください。 ブログの記事.

TortoiseGit がこれを行います。このブログ投稿を参照してください。 http://jimmykeen.net/articles/03-nov-2012/how-maigrate-from-svn-to-git-windows-using-tortoise-clients

ええ、リンクで答えるのは素晴らしいことではないのはわかっていますが、それは解決策ですよね?

これを強くお勧めします 短いシリーズのスクリーンキャスト たった今発見しました。著者は基本的な操作を説明し、より高度な使用法をいくつか紹介します。

SourceTree を使用している場合は、アプリから直接これを行うことができます。[ファイル] -> [新規/クローン] に移動し、次の操作を行います。

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

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

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

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

のために 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-project で作成されます dev-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 Web UI でプロジェクト ページをリロードすると、すべてのコミットとファイルがリストに表示されるようになります。

ノート

  • 不明なユーザーがいる場合、 git svn clone コマンドは停止します。その場合、更新は行われません。 users.txt, cd favourite-project そして git svn fetch 停止したところから継続します。
  • 標準 trunk-tags-branches SVN リポジトリのレイアウトが必要です。
  • に与えられた SVN URL git svn clone コマンドはすぐ上のレベルで停止します trunk/, tags/ そして branches/.
  • git svn clone このコマンドは、上部にいくつかの警告を含む大量の出力を生成します。私は警告を無視しました。

余談ですが、git-stash コマンドは、git-svn dcommit で git を実行しようとする場合に天の恵みとなります。

典型的なプロセス:

  1. gitリポジトリをセットアップする
  2. 別のファイルで作業を行う
  3. git を使用して作業の一部をチェックインすることにします
  4. と決める svn-dcommit
  5. 恐ろしい「ダーティインデックスではコミットできません」エラーが発生します。

解決策 (git 1.5.3+ が必要):

git stash; git svn dcommit ; git stash apply

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

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

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

私は 12 個の SVN リポジトリを Google Code から GitHub に移動するのに非常に苦労しました。Windows を使用していたのは役に立ちませんでした。私の古い Debian ボックスでは Ruby がいろいろ壊れていて、Windows 上で動かすのは冗談でした。他のソリューションは Cygwin パスでは機能しませんでした。何かが機能するようになったとしても、タグを GitHub に表示する方法がわかりませんでした (秘密は --follow-tags です)。

最終的に、上記のリンクにある 2 つの短くて単純なスクリプトをまとめてみましたが、これはうまく機能しました。解決策をこれ以上複雑にする必要はありません。

私はWindowsマシンを使用しており、呼び出しだけで履歴付きのSVNリポジトリ(ただしブランチなし)をGITリポジトリに転送するための小さなバッチを作成しました。

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

もしかしたら誰でも使えるかもしれません。TMP フォルダーを作成し、そこにある SVN リポジトリを git でチェックアウトし、新しいオリジンを追加してプッシュします。そして再びフォルダを削除します。

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

Git コミュニティに自分の貢献を追加したかっただけです。完全なインポートを自動化する単純な bash スクリプトを作成しました。他の移行ツールとは異なり、このツールは jGit ではなくネイティブ git に依存します。このツールは、大規模なリビジョン履歴や大規模な BLOB を持つリポジトリもサポートします。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 .

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

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

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

    Subversion リポジトリの移行

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

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

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

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

    svn(/project_components)trunk-> git master svn(/project_components)branches-> git branches svn(/project_components)タグ - > gitタグ

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

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

実行中に作成者が検索され、GitHub 上のユーザーに簡単にマッピングできます。

私はこれをいくつかのリポジトリに使用しましたが、かなり正確で、はるかに高速です。約 4000 件のコミットを含むリポジトリを作成するのに 10 分かかりましたが、友人が完了した後は 4 日かかりました。

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

設定にはもう少し作業が必要ですが、完了すると、他のスクリプトでは数時間かかる変換自体に数分かかりました。

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

前提条件:

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

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

  1. REPO_NAME_FOLDER ディレクトリに空のリポジトリを作成します (コンソール ツールまたは TortoiseSVN を使用)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

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

幸運を!

svn サブモジュール/フォルダー 'MyModule' をタグやブランチなしで履歴付きの git に変換します。

svn 無視リストを保持するには、手順 1 の後に上記のコメントを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top