web-dev-qa-db-ja.com

リポジトリを取得した後に作成されたリモートブランチについてgit-svnに伝えるにはどうすればよいですか?

git-svnを使用して、会社の中央svnリポジトリに対して作業しています。最近、中央リポジトリに新しい機能ブランチを作成しました。 gitについてどのように伝えるのですか? git branch -rを実行すると、fetchリポジトリに対してsvnを実行してgitリポジトリを初期化したときに存在したブランチのみが表示されますか?

189
Hank Gay

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

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
288
vjangus

すべてのリモート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リモートブランチを追跡します。

92
janos

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

53
Hank Gay

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

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

  1. ブランチが作成される前にトランクで発生した最後のコミットのSHA1を見つけます。
  2. 新しいブランチで最初のコミットのSHA1を見つけます(メッセージはおそらく「新しいブランチを作成し、trunk @ 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に移動し、現在指している古いコミットに対応するnewコミット(リベースされたnewbranch上の)の完全なSHA1を含むように編集します。 (またはgit-update-ref refs/remotes/newbranch <new-SHA>を使用することもできます。ありがとうございます。
  6. 次回git svn dcommitからnewbranchにアクセスすると、ログの更新に関するメッセージが大量に表示されます。これは正常だと思います。

gitk --allを常に開いたままにして、頻繁に更新して、何をしているかを追跡することをお勧めします。私はまだgitとgit svnが初めてなので、この方法の改善を提案してください。

14
MatrixFrog

Vjangusの答えの簡略化:

SVNで標準レイアウトを使用しており、通常のsvn initを実行している場合、git-svnが設定を行います。ただ:

  1. SVNでブランチコピーリビジョンを見つける
  2. Git-svnでそのリビジョンを取得します
  3. 新しいローカルブランチトラッキングリモートを作成する

例。 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' 
に切り替えられました。
7
Gil Hamilton

この機能に関するドキュメントは見つかりませんでしたが、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
5
Mikael Lepistö

Git-svnの癖を扱う代わりに、 SubGit を試すことができます。

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

  1. 新しいコミットをプッシュする:

    git-svn:

    $ git commit
    $ git svn rebase
    $ git svn dcommit
    

    SubGit:

    $ git commit
    $ git Push
    
  2. 受信した変更を取得する

    git-svn:

    $ git svn rebase
    

    SubGit:

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

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

4
vadishev

私を助けたvjangusの答えに追加するために、使用するgitグラフトを追加して、ブランチを適切なポイントでトランクに結び付けて、gitが履歴を見てマージを正しく実行できるようにすることも役立ちました。

これは単に、ハッシュを使用して.git/info/graftsに行を追加する場合です。

<initial branch commit> <parent commit in trunk>

例えば。

378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638

http://evan-tech.livejournal.com/255341.html へのクレジット

(これをコメントとして追加しますが、評判が十分ではありません。)

2
Haddon CD.

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

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

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

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

0
MikeHoss