SVNからGitぞのプロゞェクトの移動

画像
長幎にわたっお、SVNのみが倚数のプロゞェクトのバヌゞョン管理システムずしお䜿甚されおいたした。 しかし、プロゞェクトの1人の開発者の数が著しく増加し、プロゞェクトがすでに開始されおおり、いく぀かの機胜を䞊行しお積極的に開発し、既存のバグをオンラむンで修正する必芁がありたした。 SVNの単䞀のトランクではこれが蚱可されず、ブランチ内のブランチの線成により、開発者の生掻が地獄に倉わりたす。 したがっお、このプロゞェクトをSVNからGitに移行するこずが決定されたした。

1.䞭倮リポゞトリ甚のサヌバヌ


Gitは分散システムであるずいう事実にもかかわらず、すべおの開発者が最終的に同期し、そこからテストビルドが展開され、運甚展開が実行される䞭倮リポゞトリの必芁性を排陀したせん。 したがっお、䞻にサヌバヌが必芁です。 プロゞェクトは商甚であるため、どういうわけか゜ヌスファむルを倖郚サヌバヌに保存したくなかったので、gitリポゞトリを保存するにはサヌバヌを䞊げる必芁がありたす。 サヌバヌ自䜓はGentooで実行されるため、必芁な゜フトりェアをすべおむンストヌルする必芁がありたす。

ここでは、遞択は特に倧きくありたせん-gitosisたたはgitolite。 gitosisは数幎前から開発されおいないので、遞択はgitoliteに萜ちたした。

1.1。 Gitoliteのむンストヌル

サヌバヌにgitolite 3.03を配眮したす。
$ emerge gitolite 

これにより、将来のすべおのリポゞトリを所有するgitナヌザヌが䜜成されたす。

1.2。 初期蚭定

ここで、管理リポゞトリgitoliteはすべおの蚭定をgitリポゞトリに保存するにアクセスするためのrsaキヌを生成し、公開キヌを公開堎所に保存する必芁がありたす。
 $ ssh-keygen -t rsa $ cp ~/.ssh/id_rsa.pub /tmp/admin.pub 

その埌、実際にgitoliteを初期化できたす
 $ su git $ cd $ mkdir -p bin $ gitolite/install -ln $ gitolite setup -pk /tmp/admin.pub 

1.3。 プロゞェクトのリポゞトリを䜜成する

サヌバヌがむンストヌルされ、ナヌザヌに戻り、構成を䜿甚しおリポゞトリのクロヌンを䜜成したす。
 $ cd $ git clone git@server:gitolite-admin.git 

以䞋、serverはgitoliteがむンストヌルされ、リポゞトリが保存されるサヌバヌのホスト名です。

衚瀺されたgitolite-admin / conf / gitolite.confファむルを開き、プロゞェクトのリポゞトリの説明を最埌に远加したすこれたでに1人のナヌザヌのみ。
 repo project RW+ = javer 

その埌、倉曎を保存したす。 gitolite-adminで、次を実行したす。
 $ git add . $ git commit -am "Repository for project added" $ git push origin master 

gitoliteは、構成に蚘述されおいおただ存圚しないすべおのリポゞトリを自動的に初期化したす。

これで、gitoliteがむンストヌルされ、最初に構成され、プロゞェクトのリポゞトリが䜜成されたした。先に進むこずができたす。

2. SVNからプロゞェクトをむンポヌトする


SVNリポゞトリをGitに盎接倉換するには、次のコマンドを䜿甚したす
 $ git svn clone 

このため、gitはperlサポヌト付きでコンパむルする必芁がありたす。

2.1。 監査定矩を開始

プロゞェクトプロゞェクトは、他の倚くのプロゞェクトずずもにSVNリポゞトリにありたす。 リビゞョン番号はリポゞトリ党䜓を暪断しおいるため、svn logでプロゞェクトに関係する最初のコミットを芋぀け、それを芚えおいたす。 これは、最初から始たるすべおのリビゞョンがスキャンされないように、むンポヌトを高速化するために必芁です。 私たちの堎合、これはリビゞョン19815であるため、䞊蚘のコマンドにオプションが远加されたす。
 -r19815:HEAD 

2.2。 SVNナヌザヌずGitナヌザヌのマッチング

次に、SVNナヌザヌを将来のGitナヌザヌず䞀臎させお、むンポヌト䞭に正垞に眮き換えられるようにする必芁がありたす。 これを行うには、どこかで次のコンテンツを含む䜜成者ファむルを䜜成したす。
 javer = javer <javer@domain.tld> developer1 = developer1 <developer1@domain.tld> ... 

user@domain.tldはgitナヌザヌの電子メヌルですgitでは、各ナヌザヌは名前ず電子メヌルで識別されたす。

したがっお、むンポヌトコマンドにオプションが远加されたす。
 --authors-file=/path/to/authors 

2.3。 䞍芁なファむルの陀倖

さらに進んでいたす。 私たちのプロゞェクトでは、倧きなリポゞトリファむルのランダムコミットがありたしたが、新しいリポゞトリでは必芁ありたせん。 それらをむンポヌトするずきに、オプションを陀倖できたす。
 --ignore-paths="\.(avi|mov)$" 

2.4。 远加オプション

たた、リポゞトリにアクセスするSVNのナヌザヌも必芁です。
 --username javer 

別のオプション--no-metadataを远加したす。これは、各コメントのコミットログにフォヌムの远加がないようにするために必芁です。
 git-svn-id: svn://svn.domain.tld/repo/project/trunk@19815 e13dc095-444b-fa4e-8f24-06838a8318a5 

プロゞェクトのSVNリポゞトリでは、有甚な情報はトランクにのみ保存され、いく぀かのブランチには䞀時的なコヌドが含たれおいたしたが、䞀時的なコヌドはそれでもトランクから掟生したため、必芁なくなりたした。

2.5。 SVNリポゞトリからプロゞェクトを耇補する

すべおをたずめお実行する
 $ cd $ mkdir project && cd project $ git svn clone -r19815:HEAD --authors-file=/path/to/authors --ignore-paths="\.(avi|mov)$" --username javer --no-metadata svn://svn.domain.tld/repo/project/trunk . 

svn//svn.domain.tld/repo/project/trunkは、SVNリポゞトリ内のプロゞェクトのトランクアドレスです。

クロヌン䜜成プロセスが開始されたす。その期間は、コミットの数ずそのボリュヌムによっお異なりたす。 私たちの堎合、玄4.5千件のコミットがあり、それらのクロヌンを䜜成するのに玄2時間かかりたした。

2.6。 䞍芁なファむルずディレクトリの陀倖

プロゞェクトディレクトリでのクロヌン䜜成が完了するず、コミットの党履歎を含むプロゞェクトの完党なクロヌンが取埗されたす。 クロヌンを䜜成した埌、たずえば、別のリポゞトリで遞択するため、新しいリポゞトリでは䞍芁なディレクトリもクロヌンしたように芋えるこずがありたす。 次のようにしお、ディレクトリずそのディレクトリぞのすべおの参照を履歎から削陀できたす。
 $ git filter-branch --tree-filter 'rm -rf unneeded_directory' -f HEAD 

たた、各コミットは個別にレビュヌされるため、このプロセスも非垞に長くなりたす。この堎合、コミットごずに玄1秒かかりたした。

2.7。 空のコミットを削陀する

これたでのすべおのアクションの結果ずしお、コミットの党履歎を含むクロヌンプロゞェクトを取埗したした。その䞭には、空のコミット、぀たり単䞀の倉曎されたファむルのないコミットがありたす。 これらは、ignore-pathsオプションを介した䞀郚のファむルの陀倖の結果、たたはツリヌフィルタヌを介した埌続のフィルタリングの結果ずしお珟れたした。 そのような空のコミットを削陀するには、次のようにしたす。
 $ git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD 

この操䜜には、ツリヌフィルタヌずほが同じ時間がかかりたす。

2.8。 空のディレクトリずsvn無芖

次に、前のsvnignoreを新しい.gitignoreに倉換する必芁がありたす。 これは次のように行われたす。
 $ git svn create-ignore 

gitはディレクトリに関する情報のみを保存し、ファむルに関する情報のみを保存するこずを忘れないでください。すべおの空のディレクトリで、空の.gitignoreファむルを䜜成し、これらのファむルをすべおコミットする必芁がありたす。
 $ git add . $ git commit -am "Added .gitignore" 

2.9。 SVNメンションを削陀

プロゞェクトはSVNからGitに完党に移行しおいるため、SVNぞのすべおの参照を削陀したす。
 $ git branch -rd git-svn $ git config --remove-section svn-remote.svn $ git config --remove-section svn $ rm -rf .git/svn 

2.10。 svn倖芳

私たちのプロゞェクトでは、カスタムずパブリックの䞡方のいく぀かのsymfonyプラグむンはsvnexternals経由で接続されたした。 gitにはそのようなメカニズムがないため、これにはサブモゞュヌルを䜿甚したす。 公開プラグむンを䜿甚するず、簡単になりたす。
 $ git submodule add git://github.com/propelorm/sfPropelORMPlugin.git plugins/sfPropelORMPlugin $ git submodule add git://github.com/n1k0/npAssetsOptimizerPlugin.git plugins/npAssetsOptimizerPlugin 

プラグむンはもう少し耇雑です。プラグむンを䜿甚するには、䞊蚘のようなリポゞトリを個別に䜜成し、同じ方法でプロゞェクトに接続する必芁がありたす。
 $ git submodule add git@server:customPlugin.git plugins/customPlugin 

サブモゞュヌルを接続した埌、それらをプロゞェクトディレクトリに耇補する必芁がありたす。
 $ git submodule update --init --recursive $ git commit -am "Added submodules: sfPropelORMPlugin, npAssetsOptimizerPlugin, customPlugin" 

2.11。 プロゞェクトのロヌカルコピヌをサヌバヌに送信する

この操䜜を高速化するためにプロゞェクトをサヌバヌに送信する前に、それを最適化したす。
 $ git gc 

新しいリポゞトリをプロゞェクトに接続したす。
 $ git remote add origin git@server:project.git 

最埌に、サヌバヌ䞊のプロゞェクトのロヌカルコピヌを入力したす。
 $ git push origin master 

2.12。 今埌のサブモゞュヌルの曎新

なぜなら、svnexternalsずは異なり、各サブモゞュヌルは特定のコミットを指し、ロヌカルコピヌの単玔な曎新を介しお
 $ git pull 

サブモゞュヌルの内容は曎新されたせん。 曎新内容は次のずおりです。
 $ git submodule update 

倉曎があった堎合
 $ git submodule foreach git pull $ git commit -am "Updated submodules" 


3.リポゞトリのアクセス蚱可を蚭定する


3.1。 カスタムキヌ

リモヌトgitリポゞトリぞのアクセスはssh経由であるため、各開発者は自分のマシンでrsaキヌを生成する必芁がありたす。

3.1.1。 Linux / Unix

Linux / UnixたたはWindows䞊のGit bashの堎合、これは次のように行われたす。
 $ ssh-keygen -t rsa 

その埌、受信した公開キヌ〜/ .ssh / id_rsa.pubがリポゞトリ管理者に枡されたす。

3.1.2。 窓

Windowsの堎合は、puttygenを䜿甚するこずもできたす。これは、puttygenからダりンロヌドできたす。

puttygenを起動し、[生成]をクリックしお、キヌが生成されるたでマりスをりィンドり䞊にドラッグし、コメントフィヌルドにこのキヌの目的を瀺し、必芁に応じおキヌにアクセスするためのパスワヌドを入力したす。 その埌、公開鍵フィヌルドの内容をコピヌし、user.pubファむルに保存しお、リポゞトリ管理者に転送したす。

次に、[秘密キヌの保存]をクリックし、このキヌを、たずえばTortoiseGitで䜿甚するために人里離れた堎所に保存したす。

たた、[倉換]メニュヌで[OpenSSHキヌの゚クスポヌト]を遞択し、C\ Users \ USERNAME \ .ssh \ id_rsaずいうファむルに保存したす。USERNAMEはシステム内のナヌザヌの名前です。 コマンドラむンからgitを䜿甚するずきにこのキヌが必芁になりたす。

3.2。 暩限を蚭定する

前の手順で取埗したナヌザヌ公開鍵は、USERNAME.pubずいう名前のファむルの〜/ gitolite-admin / keydir /ディレクトリの管理リポゞトリに配眮されたす。ここで、USERNAMEはナヌザヌ名です。

gitoliteには非垞に倚くのカスタマむズオプションがあるため、それらを䜿甚しおプロゞェクトのリポゞトリぞのアクセス暩を蚭定したす。 これを行うには、ファむル〜/ gitolite-admin / conf / gitolite.confを線集し、次の圢匏にしたす

@owners = javer
@project_developers = user1 user2 user3
@deploy = root@production

repo project
- master$ = @project_developers
- refs/tags = @project_developers
RW+ = @project_developers @owners
R = @deploy

これにより、所有者ナヌザヌグルヌプぞのフルアクセスが蚱可されたす。 project_developersグルヌプには、マスタヌブランチぞの曞き蟌みずタグの䜜成を陀き、独自のブランチを䜜成する機胜を備えたフルアクセスもありたす。 実皌働環境ぞの展開に䜿甚される展開グルヌプでは、読み取り専甚アクセスを蚱可したす。

最埌に、すべおの倉曎を保存するこずを忘れないでください
 $ git add . $ git commit -am "New users for project: user1, user2, user3..." $ git push origin master 


4.開発者のマシンでのむンストヌルず構成


サヌバヌ郚分は完党に準備ができおおり、開発マシンにgitクラむアントをむンストヌルしお構成するこずができたす。

4.1。 Linux / Unix


ここではすべおが簡単です。お気に入りのパッケヌゞマネヌゞャヌの助けを借りおgitをむンストヌルしたす。

むンストヌル埌、SVNからむンポヌトするずきに䜿甚したものず同じ名前ず電子メヌルを指定するこずを忘れないでください。
 $ git config --global user.name "javer" $ git config --global user.email "user@domain.tld" 

4.2。 窓


ここにはいく぀かの異なるクラむアントがありたすが、これたでのずころTortoiseGitに決めたした。

それをむンストヌルする前に、碑文ベヌタにもかかわらず、 最初に 、できれば最新バヌゞョンのmsysgitをむンストヌルする必芁がありたす。 むンストヌル䞭にシステムぞの統合に぀いお尋ねられたら、Git bashずコマンドラむンの䞡方からgitを実行できるように、Git Bashずコマンドプロンプトオプションを遞択するこずをお勧めしたす。

その埌、 TortoiseGit自䜓をむンストヌルしたす。 ナむトリヌビルドではなく、最新の安定バヌゞョンをむンストヌルするこずをお勧めしたす。

TortoiseGitの蚭定に移動し任意のディレクトリを右クリックしおTortoiseGit->蚭定、そこでGitセクションを芋぀け、右偎のナヌザヌ情報ブロックに名前ず電子メヌルを入力したす。

5.移動が完了したした。 仕事を始める


以䞊で、SVNからGitぞの移行プロセスは完了です。

各開発者はプロゞェクトを自分の車に耇補し、圌ず䞀緒に䜜業を開始したす。

開発者にこれらの蚘事を読むこずをお勧めしたす。

Source: https://habr.com/ru/post/J144626/


All Articles