393

私はすべての作業を Git で行い、GitHub にプッシュしています。私はソフトウェアとサイトの両方に非常に満足しており、この時点で作業方法を変更したくありません.

私の博士課程の顧問は、すべての学生に、大学でホストされている SVN リポジトリに自分の作品を保管するように求めています。既存の SVN リポジトリを Git にプルダウンするためのドキュメントやチュートリアルはたくさんありますが、Git リポジトリを新しい SVN リポジトリにプッシュする方法については何も見つかりませんでした。git-svn と新しいブランチ、リベース、およびこれらすべての素晴らしい用語を組み合わせてこれを行う方法があるに違いないと思いますが、私は Git の初心者であり、それらのいずれにも自信がありません。

次に、いくつかのコマンドを実行して、選択したときにコミットをその SVN リポジトリにプッシュします。私は Git を使い続け、SVN リポジトリに Git の内容を反映させたいと思っています。

これが何か違いを生むなら、私はSVNにコミットする唯一の人になります。

4

17 に答える 17

407

私もこれが必要でした.Bombeの答えといくつかのいじりの助けを借りて、私はそれを機能させました. レシピは次のとおりです。

Git のインポート -> Subversion

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

#3 の後、次のような不可解なメッセージが表示されます。

上位レベルの URL を使用:protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

それを無視してください。

#5 を実行すると、競合が発生する可能性があります。これらを解決するには、状態が「マージされていない」ファイルを追加し、リベースを再開します。最終的には完了です。次に、 を使用して SVN リポジトリに同期しますdcommit。それで全部です。

リポジトリの同期を維持する

次のコマンドを使用して、SVN から Git に同期できるようになりました。

git svn fetch
git rebase trunk

Git から SVN に同期するには、次を使用します。

git svn dcommit

最後の注意事項

ライブ リポジトリに適用する前に、ローカル コピーでこれを試してみることをお勧めします。Git リポジトリのコピーを一時的な場所に作成できます。cp -rすべてのデータがリポジトリ自体にあるため、単純に を使用します。次に、以下を使用して、ファイルベースのテスト リポジトリを設定できます。

svnadmin create /home/name/tmp/test-repo

そして、次を使用して作業コピーをチェックアウトします。

svn co file:///home/name/tmp/test-repo svn-working-copy

これにより、永続的な変更を加える前に、いろいろと試すことができます。

追記:間違えたらgit svn init

うっかり間違った URL で実行git svn initしてしまい、作業のバックアップを作成するほど頭がよくなかった場合 (聞かないでください...)、同じコマンドをもう一度実行することはできません。ただし、次を発行して変更を元に戻すことができます。

rm -rf .git/svn
edit .git/config

そして、セクション[svn-remote "svn"]セクションを削除します。

git svn initその後、新たに実行できます。

于 2009-04-21T14:36:06.000 に答える
35

これが私たちがそれを機能させた方法です:

マシンのどこかにGitリポジトリのクローンを作成します。

以下を開い.git/configて追加します(Gitリポジトリーの読み取り専用SVNミラーの保守から):

[svn-remote "svn"]
    url = https://your.svn.repo
    fetch = :refs/remotes/git-svn

次に、コンソールウィンドウから、次のように入力します。

git svn fetch svn
git checkout -b svn git-svn
git merge master

ここで何らかの理由で壊れた場合は、次の3行を入力します。

git checkout --theirs .
git add .
git commit -m "some message"

そして最後に、SVNにコミットできます。

git svn dcommit

注:後でそのフォルダーを常にスクラップします。

于 2012-01-19T19:56:40.407 に答える
9

プロジェクトの Subversion リポジトリに新しいディレクトリを作成します。

# svn mkdir --parents svn://ip/path/project/trunk

Git マネージド プロジェクトに変更し、git-svn を初期化します。

# git svn init svn://ip/path/project -s
# git svn fetch

SVN プロジェクト ディレクトリがまだ空であるため、これにより単一のコミットが作成されます。そのコミットのすべてをリベースgit svn dcommitすれば、完了です。ただし、コミット日が大幅に台無しになります。

于 2009-03-19T10:14:19.253 に答える
4

SubGitを使用して 4 つのコマンドで非常に短い命令を提案します。詳細については、この投稿を参照してください。

于 2012-05-13T00:45:40.067 に答える
3

既存の Git リポジトリを空の SVN リポジトリにコミットする必要がありました。

これが私がこれを行う方法です:

$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit

問題なく動作しました。これが誰かに役立つことを願っています。

SVN リポジトリに対して別のユーザー名で自分自身を認証する必要があったため (私originは秘密鍵/公開鍵認証を使用しています)、--usernameプロパティを使用する必要がありました。

于 2014-05-09T09:36:01.283 に答える
2

Git をメイン リポジトリとして使用し続けたいが、リビジョンを時々 SVN に「エクスポート」する必要がある場合は、Tailorを使用して SVN リポジトリの同期を保つことができます。異なるソース管理システム間でリビジョンをコピーでき、Git で行った変更で SVN を更新します。

Git から SVN への変換は試していませんが、SVN -> SVN の例については、この回答を参照してください。

于 2009-03-19T04:32:02.837 に答える
1

新しい SVN リポジトリを作成できます。Git プロジェクトをエクスポートします (.git ファイルを具体化します)。これを SVN リポジトリに追加します (これまで Git にあったものでリポジトリを初期化します)。次に、新しい Git プロジェクトに SVN リポジトリをインポートする手順を使用します。

ただし、これにより以前の Git 履歴が失われます。

于 2009-03-19T04:12:13.727 に答える
1

特定の SVN を使用する必要がなく、GitHub を使用している場合は、GitHub の SVN コネクタを使用できます。

詳細はこちら: Subversion を使用した GitHub でのコラボレーション

于 2013-02-19T20:46:01.910 に答える
0

私の経験の一部を受け入れられた回答と共有したいだけです。最後のステップを実行する前に、すべてのステップを実行しましたが、すべて問題ありませんでした。

git svn dcommit

$ git svn dcommit

/usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm 行 101 で、置換 (s///) に初期化されていない値 $u が使用されています。

/usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm 101 行目の連結 (.) または文字列での初期化されていない値 $u の使用。 refs/remotes/origin/HEAD: ' https://192.168.2.101/ svn/PROJECT_NAME '' に見つかりません

スレッドhttps://github.com/nirvdrum/svn2git/issues/50を見つけ、最後に次のファイルの 101 行目に適用した解決策 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm

交換しました

$u =~ s!^\Q$url\E(/|$)!! or die

if (!$u) {
    $u = $pathname;
} 
else {
       $u =~ s!^\Q$url\E(/|$)!! or die
      "$refname: '$url' not found in '$u'\n";
}

これで問題が解決しました。

于 2015-12-01T08:36:10.400 に答える
0

Scatter という WordPress コミュニティで使用されている優れたツールを共有したいと思います。

Git WordPress プラグインと少しのサニティ スキャッター

これにより、ユーザーは Git リポジトリを wordpress.org SVN に自動的に送信できるようになります。理論的には、このコードは任意の SVN リポジトリに適用できます。

于 2013-03-27T21:59:54.510 に答える
0

私の場合、SVN からクリーンなプロジェクトを開始する必要がありました

$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch

すべてのプロジェクト ソースを追加します...

$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit
于 2015-12-02T20:25:31.553 に答える
-1

Git で行ったすべてのコミットを SVN リポジトリにコミットしたくない場合はどうすればよいでしょうか? パイプにコミットを選択的に送信したいだけの場合はどうしますか? さて、私はより良い解決策を持っています。

私は SVN からフェッチしてマージするだけのローカル Git リポジトリを 1 つ保持しています。そうすれば、SVN と同じ変更がすべて含まれていることを確認できますが、コミット履歴は SVN から完全に分離されています。

次に、別のフォルダーにある別の SVN ローカル作業コピーを保持します。それは私がコミットして SVN に戻すものであり、そのために SVN コマンドライン ユーティリティを使用するだけです。

ローカル Git リポジトリの状態を SVN にコミットする準備ができたら、ファイルの混乱全体をローカル SVN 作業コピーにコピーし、Git ではなく SVN を使用してそこからコミットします。

この方法では、リベースはフリーベースに似ているため、リベースを行う必要はありません。

于 2014-06-09T05:51:23.713 に答える