1565

私は 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

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

4

34 に答える 34

1617

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

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

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

svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $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/、branches/、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 は SVNtrunkを新しいブランチにチェックアウトします。その他のブランチはリモートとして設定されます。次のコマンドを使用して、他の SVN ブランチを表示できます。

git branch -r

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

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

タグはブランチとしてインポートされます。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
于 2010-10-19T19:45:07.157 に答える
540

魔法:

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

Git と SVN の動作は大きく異なります。Git を学ぶ必要があり、上流の SVN からの変更を追跡したい場合は、git-svn. git-svn メインページには良い例のセクションがあります:

$ git svn --help
于 2008-09-17T02:08:25.197 に答える
201

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
于 2008-09-17T02:10:22.180 に答える
73

私はsvn2gitスクリプトを使用し、チャームのように機能します。

于 2011-02-01T07:53:50.143 に答える
60

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

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

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

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

リビジョンのインポートを開始するまでさかのぼってマークします。

git svn fetch -r42

(またはすべての回転数に対して単に「gitsvnfetch」)

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

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の時間

于 2008-09-17T18:20:16.700 に答える
33

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 ではない) に移行して使用を開始できますが、必要な間は Subversion を維持したままにすることができます (たとえば、構成済みのビルド ツールなど)。

お役に立てれば!

于 2011-11-24T20:12:41.430 に答える
20

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

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

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
于 2008-09-17T17:09:55.480 に答える
14

Pro Git 8.2 で説明されています: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git

于 2011-02-11T21:17:27.193 に答える
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で Blue Screen of Death になります。ただ絶えず。そして、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 push origin '*:*'古い Git バージョンの場合)

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

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

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

于 2015-02-06T11:12:04.073 に答える
12

再建外科医

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

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

reposurgeonコマンド ラインのドキュメントを詳しく調べる前に、変換プロセスを順を追って説明している優れたDVCS 移行ガイドを必ずお読みください。

于 2015-03-20T18:20:29.037 に答える
8

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

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

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

于 2014-03-13T13:58:34.153 に答える
8
于 2014-07-22T04:36:33.677 に答える
7

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

于 2008-09-21T02:15:07.947 に答える
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) マスター ブランチを更新する

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

詳細が必要な場合は、私の投稿を読むか、私に尋ねてください。

于 2016-02-24T14:45:17.963 に答える
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

これを使用して、開発者がプロ​​パティをauthors使用して設定したように、svn ユーザー名をユーザー名と電子メールにマップするファイルを作成します(GitHub のようなサービスでは、一致する電子メールのみで十分であることに注意してください)。git configuser.nameuser.email

次に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 clonegitブランチに入れたいディレクトリを使用するだけです。

実行後

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

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

于 2013-09-25T09:23:33.273 に答える
5

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

ええ、リンクで回答するのは素晴らしいことではありませんが、それは解決策ですよね?

于 2013-04-18T03:41:17.967 に答える
4

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 による回答を参照してください)。

バージョン

  • サブバージョン バージョン 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コマンドは停止し、その場合 update users.txt、停止したところから続行しますcd favourite-projectgit svn fetch
  • 標準trunk-- SVN リポジトリのレイアウトが必要ですtagsbranches
  • コマンドに指定された SVN URL は、とgit svn cloneのすぐ上のレベルで停止します。trunk/tags/branches/
  • このgit svn cloneコマンドは、上部にいくつかの警告を含む多くの出力を生成します。私は警告を無視しました。
于 2014-09-13T13:04:29.957 に答える
3

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

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

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

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

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

于 2014-06-17T04:43:33.357 に答える
3

私が見つけたばかりのこの短い一連のスクリーンキャストを強くお勧めします。著者は、基本的な操作を順を追って説明し、さらに高度な使用法をいくつか紹介します。

于 2011-03-22T00:34:48.103 に答える
2

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

典型的なプロセス:

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

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

git stash; git svn dcommit ; git stash apply
于 2008-09-26T13:13:26.187 に答える
2

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

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

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

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

最後に、上にリンクされている 2 つの短くて単純なスクリプトをまとめてみましたが、うまくいきました。ソリューションはそれ以上複雑にする必要はありません!

于 2013-11-06T14:06:24.420 に答える
2

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 .
于 2012-02-16T18:28:52.833 に答える
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>
于 2018-02-06T06:37:45.860 に答える
0

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

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

于 2016-01-19T14:17:52.183 に答える
0

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

于 2010-09-24T14:13:01.617 に答える
0

次のスクリプトを使用して、すべての 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 <prince.rogers.nelson@payesley.park.org>

www-data は Apache Web サーバーのユーザーであり、HTTP 経由で変更をプッシュするには許可が必要です。

于 2017-01-03T17:33:27.843 に答える
0

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

前提条件:

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

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

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

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

  3. このコマンドはサイレントなので、2 番目のコマンド ウィンドウを開きsvnserve -d -R --root REPO_NAME_FOLDER ます。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

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

幸運を!

于 2016-02-15T13:00:40.403 に答える
0

オールインワン -移行用SVNのシェル スクリプト。GITプレースホルダーを使用GITしてSVN詳細を説明します<>

#!/bin/bash

######## Project name 
PROJECT_NAME="Helloworld"
EMAIL="example mail"

#Credientials Repo
GIT_USER='<git username>'
GIT_PWD='<git password>'
SVN_USER='<svn username>'
SVN_PWD='<svn password>'

######## SVN repository to be migrated # Dont use https - error will be thrown
BASE_SVN="<SVN URL>/Helloworld"

#Organization inside BASE_SVN
BRANCHES="branches"
TAGS="tags"
TRUNK="trunk"

#Credientials
git config --global user.name '<git username>'
git config --global user.password '<git password>'
git config --global credential.helper 'cache --timeout=3600'

######## GIT repository to migrate - Ensure already project created in Git
GIT_URL=https://$GIT_USER:$GIT_PWD@<GIT URL>/Helloworld.git

###########################
#### Don't need to change from here
###########################

#Geral Configuration
ABSOLUTE_PATH=$(pwd)
TMP=$ABSOLUTE_PATH/$PROJECT_NAME

#Branchs Configuration
SVN_BRANCHES=$BASE_SVN/$BRANCHES
SVN_TAGS=$BASE_SVN/$TAGS
SVN_TRUNK=$BASE_SVN/$TRUNK

AUTHORS=$PROJECT_NAME"-authors.txt"

echo '[LOG] Starting migration of '$SVN_TRUNK
echo '[LOG] Using: '$(git --version)
echo '[LOG] Using: '$(svn --version | grep svn,)

mkdir $TMP
echo
echo '[DIR] cd' $TMP
cd $TMP

echo
echo '[LOG] Getting authors'
svn --username $SVN_USER --password $SVN_PWD log -q $BASE_SVN | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2"@"$EMAIL">"}' | sort -u >> $AUTHORS

echo
echo '[RUN] git svn clone --authors-file='$AUTHORS' --trunk='$TRUNK' --branches='$BRANCHES' --tags='$TAGS $BASE_SVN $TMP
git svn clone --authors-file=$AUTHORS --trunk=$TRUNK --branches=$BRANCHES --tags=$TAGS $BASE_SVN $TMP

#Not working so no need to mention it
#--stdlayout $PROJECT_NAME
echo
echo '[RUN] svn ls '$SVN_BRANCHES
svn ls $SVN_BRANCHES

echo 
echo 'git branch -a'
git branch -a

echo
echo '[LOG] Getting first revision'
FIRST_REVISION=$( svn log -r 1:HEAD --limit 1 $BASE_SVN | awk -F '|' '/^r/ {sub("^ ", "", $1); sub(" $", "", $1); print $1}' )

echo
echo '[RUN] git svn fetch -'$FIRST_REVISION':HEAD'
git svn fetch -$FIRST_REVISION:HEAD

#Branches and Tags  
echo
echo '[RUN] svn ls '$SVN_BRANCHES
for BRANCH in $(svn ls $SVN_BRANCHES); do
    echo git branch ${BRANCH%/} remotes/svn/${BRANCH%/}
    git branch ${BRANCH%/} remotes/svn/${BRANCH%/}
done

git for-each-ref --format="%(refname:short) %(objectname)" refs/remotes/origin/tags | grep -v "@" | cut -d / -f 3- |
while read ref
do
  echo git tag -a $ref -m 'import tag from svn'
  git tag -a $ref -m 'import tag from svn'
done

git for-each-ref --format="%(refname:short)" refs/remotes/origin/tags | cut -d / -f 1- |
while read ref
do
  git branch -rd $ref
done
  
echo
echo 'git tag'
git tag

echo
echo 'git show-ref --tags'
git show-ref --tags

echo
echo '[RUN] git remote add origin '$GIT_URL
git remote add origin $GIT_URL

echo
echo '[RUN] git push'
git push origin --all --force
git push origin --tags

#echo git branch -d -r trunk
#git branch -d -r trunk

git config --global credential.helper cache
echo 'Successful.'
  • 上記のスクリプトを実行すると、SVN からブランチとタグの詳細が取得され、.gitフォルダーの下に配置されます。
  • このフォルダーSVNの下で使用できるはずのすべてのブランチが存在するかどうかをクロスチェックします。.git/refs/heads
  • そこにあったいくつかのブランチが欠落している場合は、SVNブランチファイルを手動でコピーし.git/refs/remotes/origin/<branches>てください.git/refs/heads
  • ブランチ ( を含む) のみをコピーし、またはmasterがある場合は無視します。tagstrunk
  • ここで、スクリプトを再度実行します。すべてbranchestagsgit リポジトリを確認できます。
于 2021-07-04T06:31:08.573 に答える