0

svnを使用するオープンソースプロジェクトから取得したリポジトリへの変更を管理するためにgitHubを使用している状況があります。

sed何かを変更するために使用する際に、svnトラッキングファイルを変更したことに気付くまで、すべてが順調に進んでいます。手動で修正するには多すぎます。

私は基本的にこの問題を大規模に抱えています。

これらは無傷である必要があるので、次のことを行うと思いました。

  1. 元のsvnベースのコードの新しいローカル作業コピーを作成します。
  2. このツリー内の「.svn」以外のすべてのフォルダーを再帰的に削除します。IE、「。svn」フォルダとその内容のみを含むプロジェクトツリーがある状況になります。
  3. 「gitHub」ツリー内のすべての「.svn」フォルダを再帰的に削除します。
  4. 「.svn」フォルダを越えて「gitHub」ツリーにコピーします

3つの質問:

  • これはお勧めですか?
  • そうでない場合は、svnのものを回復する方法に関する提案はありますか?
  • 正しい方向に進んでいる場合、ステップ2を達成するにはどうすればよいですか?IE、「。svn」フォルダ以外のすべてを再帰的に削除しますか?私はGoogleでステップ3を実行するためにたくさんのことを見つけましたが、これはそれらの裏返しです。
4

2 に答える 2

0

一般に、ディレクトリ間で Subversion メタデータ フォルダーをコピーしないでください。そのように物事を行うのは非常に簡単です。

代わりに、Subversion メタデータに加えられた変更を元に戻すスクリプトを作成してみてください。このコマンドを使用して、find . -name .svn -exec some_command '{}' +すべての Subversion メタデータ フォルダーを検索し、それらに対してコマンドを実行できます。some_command最後の既知の動作状態に再帰的に戻すために必要な git コマンドに置き換えます。

別のオプションは、最後の既知の作業状態でブランチを作成することです。そのブランチから作業して、メタデータ フォルダーへの変更を除くすべての変更をマージします。メタデータが破損してからの経過時間によっては、これがより簡単な方法になる場合があります。

また、Subversion 1.7 を使用している場合は、.svnディレクトリごとに 1 つではなく、作業コピーごとに 1 つのフォルダーしか存在しないため、これは少し簡単です。その場合、使用findは少しやり過ぎかもしれません。

.svn" " フォルダー以外のすべてを削除する必要がある場合は、コマンド を試してくださいfind $folder -type f | grep -v '.svn' | xargs rm -f。これにより、パスに「.svn」が含まれていない現在のディレクトリ内のすべてのファイルが削除されます (サブディレクトリに再帰します)。

于 2012-07-10T18:26:26.427 に答える
0

私が最初に提案したアプローチがうまく機能することがわかりました。

実行した手順

  • 「gitrepos」に相当する「svnrepos」を作成して、実際のリポジトリと元のファイルセットを保持する 2 つのサブディレクトリを作成します。

mkdir /home/build/REPOS/svnrepos && mkdir /home/build/REPOS/svnrepos/repos && mkdir /home/build/REPOS/svnrepos/files

  • ローカル svn リポジトリを作成します。

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

  • 一時的な svn 作業フォルダーを削除します。

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"

于 2012-07-10T20:23:11.740 に答える