2009-09-08 25 views
18

私はリモートブランチを追跡する新しいブランチを作成しようとすると、私はこれを取得:git branch -tが "Not tracking:ambiguous information"で失敗するのはなぜですか?

$ git branch -t test origin/foo 
error: Not tracking: ambiguous information for ref refs/remotes/origin/foo 

The sourceは何とか追跡する枝を探しているようだし、それが1より少ないより多くのを見つけたので、私を投げたが、私はコマンドラインで何を追跡するのかをすでに話しているので、それが探しているものを正確に得ることはできません。

何が起こっているのか、どのように修正するのか誰にでも教えてください。

+0

現在の状況を説明するためにいくつかの用語といくつかの提案を追加しました。 – VonC

+0

フィードバックをいただきありがとうございますが、実際にエラーメッセージの背後にある理由が見つかりましたか? – VonC

答えて

10

ありがとうございました!問題は、以前私のリポジトリのバックアップ/パブリックコピーを持つ目的で、--mirrorでリモートを設定していたことです。

あなたは

git remote add --mirror <name> <url> 

を実行する場合、それはばかりでなく(私はプッシュのために欲しかったものである)ミラーとしてリモートにフラグを設定するだけでなく、+refs/*:refs/*にミラー用remote.<mirror>.fetchオプションを設定し、あなたのすべてを意味していますブランチが突然あなたのミラーリポジトリを "追跡"し、追跡ブランチを作成しようとする試みが失敗するでしょう。

(追加ボーナスとして、git fetch <mirror>を実行すると、バックアップレポから古いもので、すべての引用文献を上書きしようとしている。)

この問題を解決すると思われるソリューションは、:remote.<mirror>.fetchを設定している(私は願っています、 「何も取ってこない」という意味です)。これは明らかに追跡の問題を修正し、致命的なフェッチを排除します。

+0

私はまさにこの問題を抱えており、この解決策はそれを修正しました。ありがとう。 – offby1

14

それ未満

ハズレを見つけるため:それは、所与のローカルブランチREFのための複数の追跡ブランチを返すremote_find_tracking()機能を意味つの整合リモートブランチ、より多くを見出すため。

some_remote_branchで、すでにはローカルブランチの1つで追跡されていますか?
git config -lは、現在設定しているものを確認できます)。
git branch -rまた、あなたの現在のリモート追跡の枝を一覧表示することができます。)私は思っ


リモートブランチは、そのリモート追跡の枝別の何かです。

間違っ

this threadで示すように:

リモートブランチは、 "本当の" 遠隔トラッキング分岐です。ローカルにコミットするのではなく、リモートリポジトリで何が起こっているのかが本質的に読み取り専用のコピーです。
リモートトラッキングブランチを 'git-checkout'しようとすると、分離されたHEADが得られます。

ローカルブランチ:
変更をコミットする可能性のあるブランチ。オプションで、ブランチをリモートトラッキングブランチの1つに「追従」するように設定できます。つまり、引数なしの 'git-pull'(ローカルブランチがチェックアウトされている場合)は、自動的に 'git-fetch'となり、リモートトラッキングブランチは 'git-merge'になります。

それはリモートリポジトリで見つかったすべての変更をリモート追跡ブランチを更新するgit-fetchの仕事です。
Git-pullは、git-fetchを実行し、次にgit-mergeを実行して、現在チェックアウトされているブランチを更新します。

問題はgitのマージのために、次のとおりです。

この問題が発生した

git-mergeは現在チェックアウトローカルブランチにマージするためにどの remote-tracking-branch決定する必要があります。
この状況で--trackオプションを使用して remote-tracking-branchを選択するかどうかを設定できます。

--trackセットアップリモートのブランチを参照するローカル次のブランチを、ない追跡ブランチに

Consider thatremote_find_tracking()は、単一のリモート充填SRCとrefspecを取り、後に与えられたrefspecを返します。リモートのために適切なトラッキングが設定されていれば、そのdstを埋めます。つまり、gitを意味します。

/* 
* For the given remote, reads the refspec's src and sets the other fields. 
*/ 
int remote_find_tracking(struct remote *remote, struct refspec *refspec); 

すでにローカルの次のブランチがsome_remote_branchに一致していると考えられるかもしれません。あなたは、まったく同じ名前のローカルブランチを持っていますか?
または、現在のブランチには類似の名前のリモートブランチがあり、これは任意のgit-mergeの自然な候補になります。リモートブランチgit-mergeはローカルリモートの変更を更新/マージするための分岐。

+0

私はちょうどgitによって得られたリモートブランチからローカルブランチを設定しようとしても、メッセージを受け取っているようですが、 "more"とまったく逆のことを書いていました:-) -フェッチ。 git config -lには、リモートブランチにはなじみのないものは含まれていません。git branch -rは、リモートブランチのリストです。または私は混乱物ですか? – che

+1

詳細な返信をありがとう、私はそれを読んでいるので、私は主な問題は、私が何をしているのかよく分からなかったことだと思う。 – che

+0

詳細な回答ありがとうございます。それは私の問題が同じフェッチパターンで2つのリモートを持つことによって引き起こされたことを理解するのを助けました。 – dregad

18

同じ(デフォルト)フェッチパターン(fetch = +refs/heads/*:refs/remotes/origin/*)と同じブランチを持つ2つのリモートリポジトリがあるときにもこのことがわかりました。

私はまだ私は両方のレポのにプル/プッシュし続けたいから、きちんとそれを修正する方法を働いたが、手動でプロジェクトの.git/config作品、例えばに情報を追加していない:

[branch "mybranch"] 
    remote = origin 
    merge = refs/heads/mybranch 
+7

私は別の場所に別のリモートをフェッチすることになると思います。 'fetch = + refs/heads/*:refs/remotes/origin/*'の代わりに 'fetch = + refs/heads/*:refs/remotes/another_repo/*'のようなものに改名してみてください。 – che

+0

非常に良い点 - 第2レポの原点への参照は正しいとは思わない。 "フェッチ"の行が本当に意味することを完全に理解しておく必要があるので、2番目のrepo(本質的にはミラー)を正しく構成することができます。 –

+3

'refs/heads/*:ref:/ remotes/origin/*'の意味は、リモート側の 'refs/heads'のすべてのリモート参照を取得し、' refs/heads/origin'に '側。 'refs/heads'はブランチが格納されているパスですので、リモートでブランチ' foo'があれば、ローカルリポジトリの 'origin/foo'にフェッチされます。最初の '+ 'は、宛先ブランチが常に上書きされるべきであることを意味します(追加のチェックがあることはありません)。 – che

2

私はこのような状況に陥ったが、どのようにしているのか分からない。 git branch -avのリストには、私が心配していたブランチのリモートトラッキングブランチが1つしか示されていませんでした(origin/dev)。

git checkout -b dev abc123 
git push -u origin dev 

私はGitはBranch dev set up to track remote branch dev from origin.その後引っ張っを言って、私は期待通りに働いていたプッシュし-uでプッシュをしたときは:私はそれを修正するためにやった

origin/devの代わりにハッシュをコミット進数を使用することでした。

関連する問題