git-svn
会社の中央 Subversion リポジトリに対して作業するために使用しています。最近、中央リポジトリに新しい機能ブランチを作成しました。
それを Git に伝えるにはどうすればよいですか? 実行すると、Subversion リポジトリに対して実行して Git リポジトリを初期化git branch -r
したときに存在したブランチしか表示されませんか?fetch
リモートブランチを手動で追加できます。
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
。fetch
1 つの回避策は、次のようにさらに行を追加することです。
[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
の値を編集して変更します。これが完了したら、実行して新しい svn リモート ブランチを追跡します。branches-maxRev
tags-maxRev
git svn fetch
する必要があったよう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を含めます。(または多分使用してください。ありがとうinger。)newbranch
git-update-ref refs/remotes/newbranch <new-SHA>
git svn dcommit
さnewbranch
れます。これは正常だと思います。常に開いたままにしgitk --all
て、頻繁に更新して、何をしているかを追跡することをお勧めします。私はまだgitとgitsvnに慣れていないので、このメソッドの改善を提案してください。
この機能に関するドキュメントは見つかりませんでしたが、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 パラメータを指定して 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
サブジット:
$ git commit
$ git push
着信変更のフェッチ
git-svn:
$ git svn rebase
サブジット:
$ git pull [--rebase]
新しいブランチの作成:
git-svn:
$ git svn branch foo
$ git checkout -b foo -t remotes/foo
$ git commit
$ git svn dcommit
サブジット:
$ git checkout -b foo
$ git commit
$ git push
詳細については、 SubGit のドキュメントを参照してください。
有効なレイアウトでチェックアウトしないと、リモート ブランチをチェックアウトできません。
これが私がすることです:
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
その後、自動的にブランチに切り替えられます。