198

git-svn会社の中央 Subversion リポジトリに対して作業するために使用しています。最近、中央リポジトリに新しい機能ブランチを作成しました。

それを Git に伝えるにはどうすればよいですか? 実行すると、Subversion リポジトリに対して実行して Git リポジトリを初期化git branch -rしたときに存在したブランチしか表示されませんか?fetch

4

9 に答える 9

300

リモートブランチを手動で追加できます。

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
于 2009-09-16T03:23:25.443 に答える
103

すべてのリモート 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 fetchfetch1 つの回避策は、次のようにさらに行を追加することです。

[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-maxRevtags-maxRevgit svn fetch

于 2012-04-16T11:49:38.617 に答える
53

する必要があったようgit svn fetchです。どういうわけか、変更だけでなくレポ全体を取得すると確信していました。

于 2008-11-17T21:26:29.820 に答える
15

多分私はそれをどうにかして台無しにしました、しかし私はvjangusの答えの指示に従いました、そしてそれはほとんどうまくいきました。唯一の問題は、newbranchがトランクから分岐していないように見えることでした。gitkでは、それ自体が一種の「フローティング」でした。トランクと共通の祖先はありませんでした。

これに対する解決策は次のとおりです。

  1. ブランチが作成される前にトランクで発生した最後のコミットのSHA1を見つけます。
  2. 新しいブランチで最初のコミットのSHA1を見つけます(メッセージはおそらく「Creatednew branch、copyed fromtrunk @ 12345」などです)
  3. git diff-tree <sha1 from step 1> <sha1 from step 2>-出力はありません。出力がある場合は、間違ったコミットを選択した可能性があります。
  4. git checkout local-newbranchその後git rebase <sha1 from step 1>local-newbranchこれは新しいツリーにリベースされますが、remotes/newbranch切断されたままになります。
  5. ファイルに移動して編集し、現在指している古いコミットに対応する新しいコミット(リベースされたもの).git/refs/remotes/newbranchの完全なSHA1を含めます。(または多分使用してください。ありがとうinger。)newbranchgit-update-ref refs/remotes/newbranch <new-SHA>
  6. 次回は、ログの更新に関する一連のメッセージが表示git svn dcommitnewbranchれます。これは正常だと思います。

常に開いたままにしgitk --allて、頻繁に更新して、何をしているかを追跡することをお勧めします。私はまだgitとgitsvnに慣れていないので、このメソッドの改善を提案してください。

于 2010-12-11T09:56:28.023 に答える
5

この機能に関するドキュメントは見つかりませんでしたが、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
于 2012-02-11T13:46:01.263 に答える
4

git-svn の癖に対処する代わりに、SubGitを試すことができます。

SubGit を Subversion リポジトリにインストールする必要があります。その後、特別な git-svn コマンドを使用する代わりに、標準の git ワークフローを使用できます。

  1. 新しいコミットのプッシュ:

    git-svn:

    $ git commit
    $ git svn rebase
    $ git svn dcommit
    

    サブジット:

    $ git commit
    $ git push
    
  2. 着信変更のフェッチ

    git-svn:

    $ git svn rebase
    

    サブジット:

    $ git pull [--rebase]
    
  3. 新しいブランチの作成:

    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 のドキュメントを参照してください。

于 2012-06-25T10:48:45.470 に答える
0

有効なレイアウトでチェックアウトしないと、リモート ブランチをチェックアウトできません。

これが私がすることです:

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

その後、自動的にブランチに切り替えられます。

于 2011-11-15T17:03:08.943 に答える