git-svn
を使用して、会社の中央svn
リポジトリに対して作業しています。最近、中央リポジトリに新しい機能ブランチを作成しました。 git
についてどのように伝えるのですか? git branch -r
を実行すると、fetch
リポジトリに対してsvn
を実行してgit
リポジトリを初期化したときに存在したブランチのみが表示されますか?
リモートブランチを手動で追加できますが、
git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch
すべてのリモートSVNブランチを追跡する場合、ソリューションは次のように簡単です。
git svn fetch
これにより、まだ取得されていないすべてのリモートブランチが取得されます。
追加のヒント:最初にトランクのみをチェックアウトし、後ですべてのブランチを追跡する場合は、.git/config
を編集して次のようにし、git svn fetch
を再実行します。
[svn-remote "svn"]
url = https://svn/path_to_repo_root/
fetch = path_to_trunk:refs/remotes/git-svn
branches = path_to_branches/*:refs/remotes/*
キーポイントはurl
がリポジトリのルートを指し、fetch
およびbranches
で定義されているパスがurl
に対して相対的である必要があります。
ALLではなく特定のブランチのみを取得する場合は、git svn --help
に素敵な例があります。
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
git-svn
の古いバージョンでは、このようなブランチを指定すると、git svn fetch
で新しいブランチを取得できなくなる場合があります。回避策の1つは、次のようにfetch
行を追加することです。
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
fetch = branches/blue:refs/remotes/branches/blue
fetch = branches/yellow:refs/remotes/branches/yellow
branches = branches/{red,green}/src:refs/remotes/branches/*
@AndyEstesによる別の回避策:.git/svn/.metadata
を編集し、branches-maxRev
またはtags-maxRev
の値を、新しく指定されたブランチまたはタグが作成される前のリビジョンに変更します。これが完了したら、git svn fetch
を実行して、新しいsvnリモートブランチを追跡します。
git svn fetch
;が必要だったようです。どういうわけか、変更だけではなくレポ全体を取得すると確信していました。
たぶん私はそれを台無しにしたかもしれませんが、vjangusの答えの指示に従ったので、それはほぼ動作しました。唯一の問題は、newbranchがトランクから分岐していないように見えることです。 gitkでは、それ自体が一種の「フローティング」でした。トランクと共通の祖先はありませんでした。
これに対する解決策は次のとおりです。
git diff-tree <sha1 from step 1> <sha1 from step 2>
-出力はありません。出力がある場合は、間違ったコミットを選択した可能性があります。git checkout local-newbranch
、次にgit rebase <sha1 from step 1>
。これにより、local-newbranch
が新しいツリーにリベースされますが、remotes/newbranch
は引き続き切断されます。.git/refs/remotes/newbranch
に移動し、現在指している古いコミットに対応するnewコミット(リベースされたnewbranch
上の)の完全なSHA1を含むように編集します。 (またはgit-update-ref refs/remotes/newbranch <new-SHA>
を使用することもできます。ありがとうございます。git svn dcommit
からnewbranch
にアクセスすると、ログの更新に関するメッセージが大量に表示されます。これは正常だと思います。gitk --all
を常に開いたままにして、頻繁に更新して、何をしているかを追跡することをお勧めします。私はまだgitとgit svnが初めてなので、この方法の改善を提案してください。
Vjangusの答えの簡略化:
SVNで標準レイアウトを使用しており、通常のsvn initを実行している場合、git-svnが設定を行います。ただ:
例。 SVN URLはsvn+ssh://[email protected]/repo
です。私が探しているSVNブランチはnewbranch
です。ローカルgitブランチ(リモートnewbranch
を追跡)はgit-newbranch
になります。
ステップ1:ブランチコピーリビジョンを見つける
#svn log --stop-on-copy svn + ssh://[email protected]/repo/branches/newbranch | tail -4 r7802 |誰か| 2014-03-21 18:54:58 +0000(2014年3月21日金曜日)| 1行 HEADをnewbranch に分岐----------------------- -------------------------------------------------
したがって、SVNの分岐点はリビジョン7802です。
ステップ2:リビジョンを取得する
#git svn fetch -r 7802 可能な分岐点が見つかりました:svn + ssh://[email protected]/repo/trunk => svn + ssh://[email protected]/repo/branches/newbranch、7801 ブランチの親が見つかりました:(refs/remotes/trunk)8dcf3c5793ff1a8a79dc94d268c91c2bf388894a 親の追跡に成功しました r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e(refs/remotes/newbranch)
git-svnはすべての作業を行い、リモートについて認識しました。
#git show-ref | grep newbranch 2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs/remotes/newbranch
ステップ3:リモートブランチを追跡する新しいローカルブランチを作成します。
#git checkout -b git-newbranch -t newbranch ファイルのチェックアウト:100%(413/413)、完了。 Branch git-ローカル参照refs/remotes/newbranchを追跡するように設定されたnewbranch。 新しいブランチ 'git-newbranch' に切り替えられました。
この機能に関するドキュメントは見つかりませんでしたが、git svn設定が複数のフェッチエントリをサポートしているようです。この方法では、別のリモートsvnリポジトリエントリを設定に追加したり、ワイルドカードを使用して特定のディレクトリのすべてのブランチを取得したりせずに、ブランチを個別に追加することもできます。
SVNツリーが本当に厄介で、それらがどのように配置されているかというロジックのない多くのブランチがあると仮定します。より多くの分岐を含む分岐およびサブディレクトリを持ちます。
つまり.
trunk
branches
-> branch1
-> sub-dir1
-> branch2
-> branch3
-> sub-dir2
-> branch4
-> sub-dir3
-> branchX
<... hundreds more ...>
そして、あなたはあなたのgitリポジトリに含めるブランチのいくつかを手で選びたいだけです。
最初に、追加のブランチなしでトランクのみでリポジトリを初期化できます。
git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk
その後、次の構成が表示されます。
localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk
myRepoから新しいブランチをフェッチしたいときは、次の方法で新しいフェッチエントリを構成に追加できます。
git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4
または、.git/configで同じ構成を編集できます
Configに追加した後に新しいブランチを取得するには、次を実行します。
git svn fetch -r 10000:HEAD
[編集]新しく追加されたブランチを取得するには、-allパラメーターを指定して取得を実行する必要があるようです。
git svn fetch --all -r 10000:HEAD
Git-svnの癖を扱う代わりに、 SubGit を試すことができます。
SubGitをSubversionリポジトリにインストールする必要があります。その後、特別なgit-svnコマンドを使用する代わりに、標準のgitワークフローを使用できます。
新しいコミットをプッシュする:
git-svn:
$ git commit
$ git svn rebase
$ git svn dcommit
SubGit:
$ git commit
$ git Push
受信した変更を取得する
git-svn:
$ git svn rebase
SubGit:
$ git pull [--rebase]
新しいブランチを作成する:
git-svn:
$ git svn branch foo
$ git checkout -b foo -t remotes/foo
$ git commit
$ git svn dcommit
SubGit:
$ git checkout -b foo
$ git commit
$ git Push
詳細については、 SubGitドキュメント を参照してください。
私を助けたvjangusの答えに追加するために、使用するgitグラフトを追加して、ブランチを適切なポイントでトランクに結び付けて、gitが履歴を見てマージを正しく実行できるようにすることも役立ちました。
これは単に、ハッシュを使用して.git/info/grafts
に行を追加する場合です。
<initial branch commit> <parent commit in trunk>
例えば。
378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638
http://evan-tech.livejournal.com/255341.html へのクレジット
(これをコメントとして追加しますが、評判が十分ではありません。)
有効なレイアウトでチェックアウトしないと、リモートブランチをチェックアウトできません。
これが私がすることです:
git svn init -s <svn path with no trunk> local_repo
cd local_repo
git svn fetch
## wait
その後、リモートブランチに切り替えることができます。
git checkout --track -b branch_name branch_name
その後、自動的にブランチに切り替えられます。