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
SVNユーザーをGitにマッピングするためのユーザーファイル(つまりusers.txt
)を作成します。
user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...
このワンライナーを使用して、既存の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
このコマンドはdest_dir-tmp
に新しいGitリポジトリを作成し、SVNリポジトリの取得を開始します。 "--stdlayout"フラグはあなたが共通の "trunk /、branches /、tags /" SVNレイアウトを持つことを意味することに注意してください。レイアウトが異なる場合は、--tags
、--branches
、--trunk
オプション(一般的にはgit svn help
)に慣れてください。
svn://
、http://
、https://
のすべての一般的なプロトコルが許可されています。 URLは http://svn.mycompany.com/myrepo/repository のようなベースリポジトリをターゲットにする必要があります。 /trunk
、/tag
、/branches
をnotにする必要はありません。
このコマンドを実行した後は、操作が「ハング/フリーズ」しているように見えることがよくあります。新しいリポジトリを初期化した後も長時間動かなくなることがあるのはごく普通です。やがてあなたはそれが移行していることを示すログメッセージを見るでしょう。
--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
リモートブランチから以前に作成したローカルブランチは、リモートブランチとして新しいクローンリポジトリにコピーされただけです。 (trunk/masterを飛ばしてください。)あなたが飼いたい枝ごとに:
git checkout -b local_branch Origin/remote_branch
最後に、今削除された一時的なリポジトリを指すあなたのきれいなGitリポジトリからリモートを削除してください:
git remote rm Origin
SubversionリポジトリをGitリポジトリにきれいに移行する 。まず~/authors.txt
のように、あなたのSubversionコミット作者名をGitコミッターにマッピングするファイルを作成する必要があります。
jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>
その後、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に慣れることをお勧めします。
ただし、すべての履歴を含む単純な移行のために、ここにいくつかの簡単な手順があります。
ローカルリポジトリを初期化します。
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 [email protected]:user/project-name.git
次に、必要に応じてメインブランチを同期して、両方に新しいものが含まれている場合にpull操作でリモートマスターとローカルマスターを自動的にマージします。
git config branch.master.remote Origin
git config branch.master.merge refs/heads/master
その後、あなたは私自身のgit_remote_branch
ツールを試してみることに興味があるかもしれません。
最初の説明記事: " Gitリモートブランチ "
最新版のフォローアップ: " git_remote_branchと共同作業をするgitの時間 "
SubversionからGitへのスムーズな移行のための(または同時に両方を使うための)新しい解決策があります: SubGit 。
私は自分自身でこのプロジェクトに取り組んでいます。私たちのリポジトリではSubGitを使用しています - 私のチームメイトの何人かはGitといくつかのSubversionを使用していて、これまでのところそれは非常にうまく機能します。
SubGitでSubversionからGitに移行するには、実行する必要があります。
$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL
その後、Gitリポジトリをsvn_repos/.gitに取得してクローンを作成するか、またはSubversionとこの新しいGitリポジトリを一緒に使用し続けることができます。
Subversionリポジトリに複数のプロジェクトが含まれている場合、svn_repos/gitディレクトリに複数の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ではなく)に移行して、必要に応じて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-Migrating-to-Git
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リポジトリでは移行に時間がかかります。
しかし、完了した移行の更新はほんの数秒です。
もちろん、私は SubGit を使っています、ママ。 git-svnは私を作る Blue Screen of Death 。絶えず。そしてgit-svnはGitの " filename too long "致命的なエラーで私を退屈させています。
STEPS
2.移行コマンドと更新コマンドを準備します。
私たちがWindowsのためにそれをするとしましょう(それはLinuxへの移植は自明です)。
SubGitのインストールbinディレクトリ(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に似た追加のパラメータ 。 SVN作者の電子メールアドレスのドメインを修正するために - default-domain myCompanyDomain.comのみを使用しています。
私は標準的なSVNリポジトリの構造(trunk/branches/tags)を持っています、そして私たちは "著者マッピング"に問題を抱えていませんでした。だから私はもう何もしていません。
(ブランチなどのタグを移行する場合、またはSVNに複数のブランチ/タグフォルダがある場合は、より冗長なSubGitを使用することを検討してください。 approach )
ヒント1:--minimal-revision YourSvnRevNumberを使用して、状況がどのように速く再現されるかを確認します(ある種のデバッグ)。特に有用なのは、解決された著者名またはEメールを見ることです。
または、移行履歴の深さを制限します。
ヒント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 config --global http.postBuffer 1073741824
524288000 - 500 MB 1073741824 - 1 GBなど.
あなたのローカルを修正してください 証明書の問題 。あなたのgit-serverが壊れた証明書を使っているなら。
無効にしました 証明書 。
またあなたのGitサーバーには リクエスト量の制限を修正する必要がある があるかもしれません。
ローカルのGitで実行します。
git Push Origin --mirror
(git Push Origin '*:*'古いGitバージョンの場合)
次のように表示された場合:エラー:gitを起動できません:そのようなファイルやディレクトリはありません...私の場合、リポジトリを完全に再作成すると解決できます( 30時間)次のコマンドを試すことができます
git Push Origin --all
git Push Origin --tags
または Gitを再インストール (私には無用です)。あるいは、あなたが持っているすべてのタグからブランチを作成してプッシュすることもできます。または、または、または...
複雑な場合には、 Eric S. Raymond による担当外科医が選択のツールです。 SVNに加えて、それはfast-export
フォーマット、そして _ cvs _ を介して他の多くのバージョン管理システムをサポートします。作者は Emacs や FreeBSD のような古代のリポジトリの変換に成功したと報告しています。
このツールは明らかに 長い歴史を持つ難しいリポジトリレイアウトのためでさえも(ほぼSVNのsvn:ignore
プロパティを.gitignore
ファイルに変換するような)ほぼ完全な変換を目指しています 多くの場合、他のツールの方が使いやすいかもしれません。
reposurgeon
コマンドラインのドキュメントを掘り下げる前に、変換プロセスを段階的に説明している優れた DVCS移行ガイド を必ず読んでください。
アトラシアンのウェブサイト上のこのガイドは私が見つけた最も良いものの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のコミットにはもっと豊富なデータがありますが、最も簡単な方法では、コミットの作成者は名前とEメールアドレスをリストに含める必要があります。デフォルトではgit-svnツールはSVNユーザー名を作者とEメールの両方のフィールドにリストするだけです。しかし、少し手を加えるだけで、すべてのSVNユーザーのリストと、それに対応するGit名とEメールの一覧を作成できます。このリストは普通のsvnユーザ名を適切なGitコミッタに変換するためにgit-svnによって使われることができます。
ローカルの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 <[email protected]>
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 propertiesを.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の「トランク」ブランチ名と一致させます。
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の標準的な「マスター」ブランチに名前を変更します。
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で始まる特別に長いコマンドのための二次プロンプトを提供するでしょう。
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
これを使用して、開発者が git config
properties user.name
およびuser.email
を使用して設定したsvnのユーザー名をユーザー名および電子メールにマッピングするauthors
ファイルを作成します。
それから git svn
にsvnレポジトリをgitレポジトリにクローンして、マッピングについて教えます。
git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot
Git svnは存在する全てのタグやブランチの全てのリビジョンを個別にチェックアウトするので、これは非常に長い時間がかかる可能性があります。 (SVNのタグは実際には単なるブランチなので、Gitではそのようになります)。不要なSVNの古いタグやブランチを削除することでこれをスピードアップできます。
同じネットワーク内または同じサーバー上のサーバーでこれを実行すると、実際にこれを高速化することもできます。また、何らかの理由でこのプロセスが中断された場合は、 can を使用して再開できます。
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以上が必要であることに注意してください。
GitHubは SVNリポジトリからインポートする という機能を持ちます。私は試したことがない。
Svnタグをgitタグに、svnブランチをgitブランチに変換するなど、svnをgitに変換するためのステップバイステップガイド( here )を投稿しました。
短縮版:
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)マスターブランチを更新する
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 [email protected]: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コミットから作成者ファイルを作成します。
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リポジトリをローカルに作成します。
問題は、ブランチやタグをPushに変換しないことです。手動でそれらをしなければならないでしょう。下記はブランチの例です。
$ 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 utilityはブランチとタグを使った手作業を取り除きます。
コマンド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
コマンドを囲むNiceラッパーです。
完全な例については、my blogエントリ を参照してください。
TortoiseGitはこれを行います。このブログ記事を参照してください: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients
ええ、私はリンクで答えることは素晴らしいではないことを知っていますが、それは解決策ですね。
GitLab usersについてSVNからの移行方法についての要旨をここに示しました。
https://Gist.github.com/leftclickben/322b7a3042cbe97ed2af
svn.domain.com.au
でホストされています。http
経由でアクセス可能です(他のプロトコルでも動作するはずです)。git.domain.com.au
および:でホストされています。dev-team
で作成されます。ssh [email protected]
を使用したテスト)。favourite-project
はdev-team
名前空間に作成されます。users.txt
には、関連するユーザーの詳細が1行に1ユーザーずつusername = First Last <[email protected]>
の形式で入っています。ここで、username
はSVNログで指定されたユーザー名です。 (詳細については、参考文献のセクションの最初のリンクを参照してください。特に、ユーザーCaseyによる回答)。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 [email protected]: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
レイアウトが必要です。git svn clone
コマンドに指定されたSVN URLは、trunk/
、tags/
およびbranches/
のすぐ上のレベルで停止します。git svn clone
コマンドは、上部にいくつかの警告を含む、大量の出力を生成します。私は警告を無視しました。SourceTreeを使用している場合は、アプリから直接これを実行できます。 [ファイル] - > [新規作成]の順に選択し、次の操作を行います。
SourceTreeでレポジトリを開くと、コミットメッセージも移行されたことがわかります。
それではRepository - > Repository Settingsに行き、新しいリモートリポジトリの詳細を追加してください。望むならSVNリモートを削除してください(私はこれを "Edit Config File"オプションで行いました。
準備ができたら、コードを新しいリモートリポジトリにプッシュして、自由にコード化します。
私はこれを強くお勧めします スクリーンキャストの短いシリーズ 私はちょうど発見しました。作者は基本的な操作を通してあなたを歩き、そしていくつかのより高度な用法を紹介します。
これは、1つ以上のSVNリポジトリをgitに変換し、それらをGitHubにプッシュする、依存関係のない単純なシェルスクリプトです。
https://Gist.github.com/NathanSweet/7327535
約30行のスクリプトで、git SVNを使用したクローン作成、SVN :: ignoreプロパティから.gitignoreファイルの作成、ベアgitリポジトリへのプッシュ、SVNトランクのマスターへの名前変更、SVNタグのgitタグへの変換、およびGitHubへのプッシュを行います。タグを保存しながら。
私は1ダースのSVNリポジトリをGoogle CodeからGitHubに移動することに大変苦労しました。それは私がWindowsを使ったことを助けにはならなかった。 Rubyは私の古いDebianマシンではいろいろな種類のものが壊れていたので、Windows上で動かすのは冗談でした。他の解決策はCygwinパスではうまくいきませんでした。何かがうまくいったとしても、そのタグをGitHubに表示させる方法はわかりませんでした(秘密は--follow-tagsです)。
最後に、上記でリンクされた2つの短くて単純なスクリプトをまとめました、そしてそれは素晴らしい働きをします。解決策はそれ以上複雑である必要はありません。
別の余談として、git-svn dcommitsでgitしようとしたときのgit-stashコマンドは天の恵みです。
典型的なプロセス:
svn-dcommit
に決める解決策(git 1.5.3以降が必要です):
git stash; git svn dcommit ; git stash apply
私はWindowsマシンを使っていて、履歴付きのSVNリポジトリ(ブランチは除く)をGITリポジトリに転送するための小さなバッチを作成しました。
transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo
おそらく誰でもそれを使うことができます。 TMPフォルダを作成し、そこにSVNリポジトリをgitでチェックアウトし、新しいOriginを追加してそれをプッシュします...そしてフォルダを再び削除します。
@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 <[email protected]>
私は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 .
この目的を達成するためのさまざまな方法があります。私はそれらのいくつかを試してみました、そして本当にgitとsvnがWindows OSにインストールされたもので動くものを見つけました。
前提条件:
svnadmin dump /path/to/repository > repo_name.svn_dump
最終目標を達成するためのステップ(履歴のあるすべてのリポジトリをgitに移動し、まずローカルのgitに移動し、次にリモートに移動します)
REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER
ディレクトリに空のリポジトリを(コンソールツールまたはtortoiseSVNを使用して)作成し、dumpfile.dumpをREPO_NAME_PARENT_FOLDERに配置します。
svnadmin load REPO_NAME_FOLDER < dumpfile.dump
この操作を待ちます。長くなる可能性があります
このコマンドは表示されないので、2番目のcmdウィンドウを開きます。svnserve -d -R --root REPO_NAME_FOLDER
なぜfile:/// ......を使用しないのですか。 answer https://stackoverflow.com/a/6300968/4953065 のおかげで、次のコマンドはUnable to open ... to URL:
で失敗します。
新しいフォルダを作成します。SOURCE_GIT_FOLDER
cd SOURCE_GIT_FOLDER
最後に、我々は何を手に入れましたか?
私たちのローカルリポジトリをチェックしましょう:
git log
以前のコミットを見ますか?もしそうなら - 大丈夫
だから今あなたはあなたの情報源と古いsvnの歴史を持つ完全に機能的なlocal 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
私の場合は、タグが必要ではありません。
がんばろう!
GitHubにはインポーターがあります。リポジトリを作成したら、そのURLを介して既存のリポジトリからインポートできます。該当する場合、それはあなたの資格情報を要求し、そこから行きます。
実行中は作者が見つかるので、GitHub上でそれらを単にユーザーにマッピングすることができます。
私は今、いくつかのリポジトリにそれを使っています、そしてそれはかなり正確で、はるかに速いです! 4000コミットまでのリポジトリを作成するのに10分かかりました。それから、4日後に私の友人がかかりました。
SubversionでGitを効果的に使用するは、git-svnの入門書です。既存のSVNリポジトリにとって、git-svnはこれをとても簡単にします。新しいリポジトリを始めているのであれば、最初に空のSVNリポジトリを作成し、次にgit-svnを使ってインポートするほうが、逆の方向に進むよりもはるかに簡単です。新しいGitリポジトリを作成してからSVNにインポートすることはできますが、特にGitに慣れておらず、コミット履歴を保存したい場合は、少し面倒です。
ここにいくつかの答えは https://github.com/nirvdrum/svn2git を参照します、しかし大きいリポジトリのためにこれは遅くなることがあります。 https://github.com/svn-all-fast-export/svn2git を使用してみました。これは、まったく同じ名前のツールですが、KDEをSVNからGitに移行するために使用されていました。
セットアップには少し手間がかかりますが、変換が完了したときに他のスクリプトが何時間もかかった時間が数分かかりました。
Windows用のRubyインストーラーをダウンロードし、それと共に最新版をインストールしてください。あなたのパスにRuby実行ファイルを追加してください。
それから「gem install svn2git」と入力して、
Subversionリポジトリを移行します
Rubyのコマンドプロンプトを開き、ファイルを移行するディレクトリに移動します。
それからsvn2git http:// [ドメイン 名前]/svn/[リポジトリルート]
プロジェクトのコードサイズによっては、プロジェクトをGitに移行するのに数時間かかることがあります。
この主なステップは、後述のGitリポジトリ構造の作成に役立ちます。
SVN(/ Project_components)トランク - > GitマスターSVN(/ Project_components)ブランチ - > GitブランチSVN(/ Project_components)タグ - > Gitタグ
リモートリポジトリを作成して変更をプッシュします。
以下のスクリプトを使用して、すべてのSVNリポジトリのリストを含むテキストファイルを読み取り、それらをGitに変換し、後でgit clone --bare
を使用してベアGitリポジトリに変換します。
#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
printf '%s\n' "$repo_name"
Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
Sudo git clone --bare /programs/git/$repo_name $repo_name.git
Sudo chown -R www-data:www-data $repo_name.git
Sudo rm -rf $repo_name
done <"$file"
list.txtの形式は以下のとおりです。
repo1_name
repo2_name
Users.txtの形式は次のとおりです。
(no author) = Prince Rogers <[email protected]>
www-dataはApache Webサーバーのユーザーであり、HTTP経由で変更をプッシュするには許可が必要です。
Svn submodule/folder 'MyModule'をタグやブランチのない履歴付きのgitに変換します。
Svn ignore listを保持するには、ステップ1の後に上記のコメントを使用してください。