2

私は Git を使用しているので、ローカル ブランチを作成してマスター ブランチにスカッシュし、(トランク上で) SVN に DCommit してから、そのローカル ブランチを (Git 上で) 削除できるという事実が気に入りました。

ここで、SVN ブランチを処理する方法を知りたいと思います。新しい機能についてチームと協力する必要がありますが、Trunk ではやりたくありません。したがって、トランクから分岐し、作業に満足してトランクにマージするまで、そのブランチで作業する必要があることは明らかです。

Git フロントエンドの観点からそれを行う方法についてのアイデアはありますか? そこにはたくさんのリソースがあると確信していますが、それを説明するものは見つかりませんでした。

念のために言っておきますが、私は SVN トランクだけで Git を使用する方法を知っています。簡単でいいですね。しかし、トランクから SVN に分岐し、作業が完了するまで Git を使用してそのブランチで作業し (Git を使用して SVN トランクにアクセスできることを願っています)、そのブランチを SVN のトランクにマージします (再び Git を使用)。誰かが私にそれについての洞察を与えることができれば、私は非常に感謝しています! 単一の Git リポジトリ内でそれを行うことは可能ですか?

前もって感謝します。(まだはっきりしない場合はお知らせください)。

4

2 に答える 2

3

数か月前にこのトピックについてブログを書きました: http://www.jillesvangurp.com/2012/08/04/git-presentation/

つまり、単一の git リポジトリで複数の svn ブランチを追跡できますが、そうすべきではありません。ある機会にめちゃくちゃになったので、基本的に、1 つのリポジトリで複数の svn ブランチを追跡しようとすることは決してありません。それはあまりにも不安定で、svn に大きなダメージを与えるのは簡単すぎます。基本的に、ローカルではすべて問題ないように見えたので、変更をコミットしませんでした。しかし実際には、並べ替えてはならないいくつかのコミットを並べ替えてしまい、アップストリームに多くの損害を与えました。結局、私は大きなsvn revertをしなければなりませんでした。とても恥ずかしい。

そのため、代わりに個別の git リポジトリを使用して各 svn ブランチを追跡し、それらのリポジトリを git のみのリポジトリでリモートとして使用して、実際にさまざまなリモート リポジトリにプッシュする作業を行います。このように git と svn を分離することは非常に理にかなっています。履歴を線形に保ち (svn は非線形にしない)、常にアップストリームに対してリベースするようにしてください。

このコンテキストでブランチ/リポジトリ間でコミットを移動するより安全な方法 (git の世界でも同じこと) は、git format-patch と git am を使用することです。または、リポジトリ内で git cherry-pick を使用できます。

于 2013-01-29T10:09:57.993 に答える
1

Git を使用して SVN ブランチを操作するために必要なことをついに発見しました。私は以下のことを試しました (私が指定した場合を除く) ので、何かおかしいことや的外れなことをしない限り、Git から SVN へのコミットは問題なく動作するはずです。もちろん、問題が発生しても責任は負えません!私はさらなるコメント/発言を受け付けています。

標準レイアウトで SVN リポジトリのクローンを作成しない場合でも、Subversion で関連する SVN パスを指すリモートを構成する必要があります。

SVN ブランチのクローンを作成するには (SVN パスは、トランク、ブランチ、およびタグを含むルート パスを指している必要があります):

git svn clone -s http://myrepo.com c:/my/local/path

すでに SVN ブランチのクローンを持っている場合は、リモートを他の SVN ブランチに手動で追加する必要があります。これらを確認してください。

重要なのは、リモート ブランチを追跡しているローカル ブランチがあることです。

git checkout -b localbranch remotes/remote_branch

これで、そのローカル ブランチに対して commit できるようになり、完了するたびにトランクと同じようにこれを実行できます。

git svn fetch
git svn dcommit

その SVN ブランチが最終的に完了し、トランクにマージしたい場合は、次の操作を実行できます (そのブランチからすべてを取得し、マスターにリベースします)。

git checkout master
git merge localbranch
git rebase -i trunk  (just save the message)
git svn fetch
git svn dcommit

必要に応じてスカッシュ マージを実行することもできます (これらの小さなチェックインをすべて実行したくない場合)。

git merge --squash localbranch
git svn fetch
git svn dcommit

実際の DCOMMIT を実行する前に予行演習を行って、すべてが正常であることを確認している可能性があります (宛先を含む)。

git svn dcommit -dry-run

ただし、マージの競合が予想される場合 (これは私が Web で読んだことですが、私はそれを試していないため、言及しているだけです)、git checkout master上記の行の前に次のことを行ってください。これは、マージの競合などに対処するために使用する必要があるリモート ブランチを追跡しないローカル ブランチです。これが必要かどうかは別の話です。

git checkout -b merge_work master
git merge localbranch
git checkout master
git rebase merge_work

私は自分自身と、将来これを試してみたいと思うかもしれない他の人々のためにこれを書き留めています.

于 2013-07-02T11:41:24.993 に答える