私が最初に提案したアプローチがうまく機能することがわかりました。
実行した手順
- 「gitrepos」に相当する「svnrepos」を作成して、実際のリポジトリと元のファイルセットを保持する 2 つのサブディレクトリを作成します。
mkdir /home/build/REPOS/svnrepos && mkdir /home/build/REPOS/svnrepos/repos && mkdir /home/build/REPOS/svnrepos/files
cd /home/build/REPOS/svnrepos/repos && svnadmin create project_name
- 元のソース ファイルを取得します。これは「project_name」として展開されます:
cd /home/build/REPOS/svnrepos/files && wget http://site.net/project_name.tar.gz && tar -xzf project_name.tar.gz
- 元のソース ファイルを新しいローカル リポジトリにインポートします。
svn import /home/build/REPOS/svnrepos/files/project_name file:///home/build/REPOS/svnrepos/repos/project_name -m "Initial import of project_name"
- この名前を一時的なsvn作業フォルダーに使用するため、既存の「GIT_Project」フォルダーの名前を変更します。
cd /home/build/REPOS/gitrepos && mv GIT_Project GIT_Project_git
- 新しい「GIT_Project」フォルダーを作成し、svn リポジトリーをこれにチェックアウトします。
mkdir GIT_Project && svn co file:///home/build/REPOS/svnrepos/repos/project_name /home/build/REPOS/gitrepos/GIT_Project
- 「.svn」ディレクトリ ツリーの下にない新しい一時 svn 作業フォルダ内のすべてのファイルを再帰的に削除します。フォルダー構造はそのままにします。
cd /home/build/REPOS/gitrepos/GIT_Project && find . -type f | grep -v '.svn' | xargs rm -f
- 元の git バージョン フォルダー内のすべての「.svn」フォルダーを再帰的に削除します。
cd /home/build/REPOS/gitrepos/GIT_Project_git && rm -rf
探す 。-type d -name .svn`
- 切り捨てられた一時的な svn 作業フォルダーから tar ファイルを作成します。
cd /home/build/REPOS/gitrepos && tar -czf svn.tgz GIT_Project
rm -fr GIT_Project
- git バージョンのフォルダーの名前を元の名前に戻します。
mv GIT_Project_git GIT_Project
- 切り捨てられた一時 svn 作業フォルダー tar ファイルを解凍して、更新された「.svn」フォルダーとコンテンツを git バージョン フォルダーに追加します。
tar -xzkf svn.tgz
- git バージョン フォルダーの svn ステータスを取得します。削除された
ファイルまたはフォルダーが「?」で表示されます。'!' が付いたプレフィックスと不足しているファイルまたはフォルダー プレフィックス。リストを外部ファイルに保存し、検索と置換を使用して、これらをそれぞれ「svn add」と「svn delete」に変更します。svn に追加してはならないファイルとフォルダーをスキップすることを忘れないでください。
cd GIT_Project && svn status
- 修正された svn status 出力を使用して svn を更新します。
svn add fileORfolder_1 && svn add fileORfolder_2 ... && svn add fileORfolder_n
svn delete fileORfolder_1 && svn delete fileORfolder_2 ... && svn delete fileORfolder_n
svn commit -m "Realign svn and git"