6


Git リポジトリと SVN リポジトリがあり、どちらも同じソース コードを保持していますが、コミット履歴が異なりますGit リポジトリには、よくコメントされた小さな投稿がたくさんあります... 一方、SVN リポジトリには、「たくさんのもの」のようなコメントが付いたいくつかの大きなコミットがあります。両方の一連のコミットは、コードで行われた同じ変更に従い、ほ​​ぼ同等です。

現在の Git リポジトリから詳細な履歴を失うことなく
、 Git-SVN の使用に切り替えたいと考えています。これは、Git リポジトリの履歴をプロジェクトの SVN ブランチ (実際に Git を使い始めた時点から分岐) に「移植」することによって行う必要があります。

どうしてそうするか?(履歴)
少し前に Git で遊び始めました。SVN の管理下にあったプロジェクトに Git リポジトリを設定することから始めました。ちょっとした設定で、Git と SVN の両方を同じソース コードで並行して動作させることができました。

これは、SVN のセーフティ ネットを利用しながら、Git を学び、操作するための優れた方法でした。それは基本的に実際のデータを持つサンドボックスでした。Git を実際に学ぶ時間はありませんでしたが、Git をいじりたいと思っていました。実際、これは私にとって Git を学ぶのにとても良い方法でした。

最初に、いくつかの編集を行った後、SVN にコミットし、次に Git にコミットし、変更が安全に SVN にあることを確認して Git を操作しました。すぐに、私は SVN よりも Git に頻繁にコミットするようになりました... 今では、SVN コミットは、私が時々やらなければならない厄介な雑用に陥っています。

と の違いを学んだときgit revertsvn revert私はSVN リポジトリにチェックインしていたことをとてもうれしく思いました2つが同じように機能すると仮定すると、数週間の作業をほとんど失いました。

私は今、Git-SVN の栄光を知っており、他のいくつかのプロジェクトで喜んで使用しています。私が始めたとき、Git リポジトリを失い、新しいものを「適切に」使用してセットアップする必要があるかもしれないことを完全に理解しましたgit-svn init...しかし、Git をしばらく使ってみたので、Git の履歴をハッキングする方法があると確信していますSVNに。

4

6 に答える 6

2

やりたいことをやるのは難しいかもしれません。http://code.google.com/p/support/wiki/ImportingFromGitのような方法で svn に git リポジトリをインポートできますが、競合が発生すると思います。git リポジトリに基づいて、SVN リポジトリをゼロから再作成することができます。

将来の参考のために、Git を SVN クライアントとして使用する方がおそらく簡単だったでしょう。

git-svn clone path/to/your/svn/repo
git-commit -a -m 'my small change'
vi some files to change.txt
git-commit -a -m 'another small change' 
git-svn dcommit # sends your little changes as individual svn commits
于 2008-09-22T20:56:07.460 に答える
2

これは不可能のようです。現在の git リポジトリを現在の svn リポジトリに結合することは可能ですが、git リポジトリの履歴を svn リポジトリに再生することはできないようです。

私が抱えていた主な問題は、git-svn を単一の svn コミットに「ラッチ」させることでした。この問題の答えは のようgit-svn set-treeです。このブログ投稿が最も役に立ちました:
http://www.reonsoft.com/~john/blog/2008/06/05/git-first-git-svn-later/

これは、履歴をsvnに保持しようとすることができる限りです:

git branch svn-reconsile HASH_OF_SECOND_COMMIT
git checkout -f svn-reconsile

git svn init file://path/to/repos/myproject/branches/git-import
git svn fetch

git svn set-tree HASH_OF_SECOND_COMMIT

git rebase git-svn

git merge master

git svn dcommit

問題はgit svn dcommit、svn で 1 つのリビジョンのみを作成することです...ブランチ内のコミットごとに 1 つではありませんmaster....そのため、履歴は svn で押しつぶされます。

したがって、より簡単な解決策は、set-tree を使用して git-svn をジャンプ スタートし、履歴が svn になくても git に残っていることに満足することです。これは、次の方法で実行できます。

git svn init file://path/to/repos/myproject/branches/git-import
git svn fetch

git svn set-tree HASH_OF_MOST_RECENT_COMMIT

git rebase git-svn

スカッシュの問題を回避する方法を誰かが知っている場合(私試しました--no-squash)、コメントしてください!巧妙なコメントの leu では、git 履歴を保持し、上記の 2 番目のコード チャンクを使用して最新の svn リビジョンに移植することを受け入れるつもりです。

于 2008-09-27T18:08:51.850 に答える
1

Tailorをチェックアウトすることをお勧めします。これを使用して git リポジトリを svn リポジトリに変換し、会社の svn サーバーで作業をホストできるようにしました。かなり柔軟なので、やりたいことができるかもしれません。

于 2008-09-26T21:00:14.303 に答える
1

これは 2 つの方法のいずれかで可能であると思います... 今それらの概要を説明し、理解できたら後で肉付けしようと思います。パーツを肉付けする方法や、パーツが機能しない理由を知っている人がいたら、コメントしてください!

1 - git-svn を使用したインプレース
(以下は疑似コマンドです。実際のものではありません - 使用しないでください)

rm .svn
(configure git-svn '/myproject/branch/git-remerge')
git svn sync_versions --svn_revision=123 --hash=ad346f221455
git svn dcommit

2 - 別の git-svn リポジトリをプロキシとして使用する
(以下は疑似コマンドです。実際のものではありません - 使用しないでください)

mkdir ../svn_proxy
cd ../svn_proxy
git svn init
git checkout hash_of_svn_branch_point
git pull ../messy_repo
于 2008-09-26T00:49:15.300 に答える
0

いくつかのことから memcached の git 履歴を処理するときに、これについて多くの作業を行いました。私が取り組んでいたことの多くは、全員が適切に功績を認められていることを確認することでした。

コミット ハッシュ、git 履歴、作成者、コミッターなどに関係なく、ツリーが収束した場所を正確に示すレポートを生成するツールを作成まし。 .

そこから、filter-branchGoogle やメーリング リストで何度も検索を行った後、多くの手作業による移植と ing を行って、変更に貢献したこれらの人々が実際に誰であるかを突き止めました。

于 2011-03-15T23:05:09.507 に答える
0

移行しようとしている git svn リポジトリから、次のような操作を行います。

git remote add old-repo <path-to-old-repo>
git fetch old-repo
# to browse and figure out the hashes, if that helps
gitk --all &

# for each branch you want to graft
git rebase --onto <new git svn branch base> <old-repo branch base> <old-repo branch tip>

# when done
git remote rm old-repo

参考までに、git format-patch と git am を使用しても同じことができるはずですが、git rebase の方が使いやすいはずです。

于 2010-08-24T00:33:28.220 に答える