履歴のある SVN リポジトリを新しい Git リポジトリに移行するにはどうすればよいですか?
-
09-06-2019 - |
質問
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 のことにうんざりしています。」ファイル名が長すぎます" 致命的な誤り。
ステップ
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 リポジトリにプッシュします
それはあなたの場合ですか?続けましょう。
- リモコンを設定する
走る:
$ git remote add origin url://your/repo.git
- 巨大なローカル Git リポジトリをリモート リポジトリに最初に送信する準備をする
デフォルトでは、Git は大きなチャンクを送信できません。致命的:リモートエンドが予期せずハングアップしました
それに向かって走りましょう:
git config --global http.postBuffer 1073741824
524288000-500 MB 1073741824-1 GBなど。
ローカルを修正する 証明書のトラブル. 。git サーバーが壊れた証明書を使用している場合。
無効にしました 証明書.
また、Git サーバーには リクエスト量の制限を修正する必要があります.
- すべての移行をプッシュする チームのリモート 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 内の「タグ/名前」という形式の非常に短いブランチにします。以下を使用して、これらすべてのブランチを実際の 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 で始まる非常に長いコマンドに対して > 二次プロンプトを提供します。
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 を使用している場合は、アプリから直接これを行うことができます。[ファイル] -> [新規/クローン] に移動し、次の操作を行います。
- リモート SVN URL を「ソース パス / URL」として入力します。
- プロンプトが表示されたら、資格情報を入力します。
- 「宛先パス」としてローカルフォルダーの場所を入力します。
- 名前を付けてください。
- 高度なオプションで、「タイプのローカルリポジトリの作成」のドロップダウンから「git」を選択します。
- 必要に応じて、クローン作成元のリビジョンを指定できます。
- クローンを押します。
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 を実行しようとする場合に天の恵みとなります。
典型的なプロセス:
- gitリポジトリをセットアップする
- 別のファイルで作業を行う
- git を使用して作業の一部をチェックインすることにします
- と決める
svn-dcommit
- 恐ろしい「ダーティインデックスではコミットできません」エラーが発生します。
解決策 (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 をインストールするだけで実際に機能することがわかりました。
前提条件:
- Windows 上の git (私はこれを使用しました) https://git-scm.com/
- コンソールツールがインストールされた svn (私は Tortoise svn を使用しました)
- SVN リポジトリのダンプ ファイル。
svnadmin dump /path/to/repository > repo_name.svn_dump
最終目標を達成するための手順 (履歴のあるすべてのリポジトリを Git に移動します。最初はローカル Git、次にリモート)
REPO_NAME_FOLDER ディレクトリに空のリポジトリを作成します (コンソール ツールまたは TortoiseSVN を使用)
cd REPO_NAME_PARENT_FOLDER
, 、dumpfile.dump を REPO_NAME_PARENT_FOLDER に置きますsvnadmin load REPO_NAME_FOLDER < dumpfile.dump
この操作はしばらくお待ちください。時間がかかる場合がありますこのコマンドはサイレントなので、2 番目の cmd ウィンドウを開きます。
svnserve -d -R --root REPO_NAME_FOLDER
file:///を使用しないのはなぜですか...?次のコマンドは失敗するため、Unable to open ... to URL:
, 、回答のおかげで https://stackoverflow.com/a/6300968/4953065新しいフォルダー SOURCE_GIT_FOLDER を作成します
cd SOURCE_GIT_FOLDER
- 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 に変換します。
- git svn clone-no-metadata - trunk = somefolder1/somefolder2/somefolder3/mymodule http://svnhost:port/repo_root_folder/MyModule_temp -a c: cheetah svn authors-transform.txt
- git clone MyModule_temp MyModule
- cd マイモジュール
- git フローの初期化
- git リモート set-url 起点https://userid@stashhost/stash/scm/xyzxyz/MyModule.git
- git Push -u オリジンマスター
- git Push -u 原点開発
svn 無視リストを保持するには、手順 1 の後に上記のコメントを使用します。