回答:
リモートブランチを手動で追加できます。
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
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
はgitチェックアウトのステップに進みます。
すべてのリモート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/.metadata
はとても役に立ちました!メタデータのリビジョン番号が「あまりにも先だった」ため、私はに追加のブランチを追加していましたが.git/config
、それgit svn fetch
は受け入れられませんでした。あるケースでは、ブランチからの最後のコミットのみがフェッチされました。私は手動で問題のあるブランチを削除しました(名前.git/svn/refs/remotes/svn/qa/XYZ
が.git/svn/refs/remotes/svn/qa/XYZ~
に変更された、その存在をにドロップした.git/packed-refs
など)...メタデータの「以前の」リビジョン番号を選択しました...実行さgit svn fetch
れて、最終的に、正しい接続グラフを含む完全な履歴が取得されました。
git svn fetch --all
。
必要なのは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
編集して、現在指している古いコミットに対応する(リベースの)新しいコミットの完全なSHA1を含めnewbranch
ます。(または多分使用します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://gil@svn.myplace.com/repo
です。私が探しているSVNブランチはですnewbranch
。ローカルgitブランチ(リモート追跡newbranch
)はになりますgit-newbranch
。
手順1:ブランチコピーのリビジョンを見つける
#は--stop・オン・コピーログのsvnのsvn + sshを://gil@svn.myplace.com/repo/branches/newbranchを| 尾-4 r7802 | 誰か| 2014-03-21 18:54:58 +0000(2014年3月21日金曜日)| 1行 HEADからnewbranchへの分岐 -------------------------------------------------- ----------------------
したがって、SVNの分岐点はリビジョン7802です。
ステップ2:リビジョンを取得する
#gitのSVN 7802 -rフェッチ 可能な分岐点が見つかりました:svn + ssh://gil@svn.myplace.com/repo/trunk => svn + ssh://gil@svn.myplace.com/repo/branches/newbranch、7801 ブランチの親が見つかりました:(refs / remotes / trunk)8dcf3c5793ff1a8a79dc94d268c91c2bf388894a do_switchで親をフォロー 親のフォローに成功しました r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e(refs / remotes / newbranch)
git-svnがすべての作業を行い、リモートについて認識しています。
#git show-ref | grep newbranch 2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs / remotes / newbranch
ステップ3:リモートブランチを追跡する新しいローカルブランチを作成します。
#gitのチェックアウト-bのgit-newbranch -t newbranch ファイルのチェックアウト:100%(413/413)、完了。 ローカルref refs / remotes / newbranchを追跡するために設定されたブランチgit-newbranch。 新しいブランチ「git-newbranch」に切り替えました
show-ref
とても貴重です)誤ってリモートブランチを参照することで立ち往生している人は、それらを削除して(私はgit branch -d newbranch
ref dirを強制的に削除する必要がありました.git/svn/refs/remotes/newbranch
)、ステップ2(上記)からやり直すことができます。
この機能に関するドキュメントは見つかりませんでしたが、git svn configurationが複数のフェッチエントリをサポートしているようです。このようにして、別のリモート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パラメータを指定してfetchを実行する必要がある場合があります。
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へのクレジット
(コメントとして追加しますが、評判が足りません。)