2009-09-08 60 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似乎以某種方式尋找分支跟蹤,並引發了我,因爲它發現不止一個,但因爲我已經告訴它要在命令行上跟蹤什麼,所以我不完全知道它在找什麼。

有人可以告訴我發生了什麼事以及如何解決它嗎?

+0

剛剛添加了一些術語和一些建議(只是導致探索,但沒有確定性),以解釋當前的情況。 – VonC 2009-09-08 21:51:56

+0

感謝您的反饋,但是您是否真的找到了錯誤信息背後的原因? – VonC 2009-09-09 16:45:05

回答

10

Got it!問題是我之前已經使用--mirror設置了一個遠程設備,用於存儲我的存儲庫的備份/公共副本。

如果運行

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

它不僅旗遠程鏡面(這是我想爲推動),而且還配置了鏡子+refs/*:refs/*,這意味着所有的remote.<mirror>.fetch選擇您的分支突然「跟蹤」您的鏡像存儲庫,任何嘗試創建跟蹤分支都將失敗。

(作爲額外的獎勵,運行git fetch <mirror>會覆蓋與舊的所有裁判從備份回購。)

這似乎解決這個問題設置remote.<mirror>.fetch:(我希望其中,該解決方案,意思是「從不取東西」)。這顯然修復了跟蹤問題並消除了致命的獲取。

+0

我有這個問題,這個解決方案修復了它。謝謝。 – offby1 2010-12-01 23:31:56

14

因爲它找到小於一個

都能跟得上:因爲它找到多於一個匹配的遠程分支,這意味着remote_find_tracking()對於給定的本地分支REF返回多於一個跟蹤分支的功能。

some_remote_branch不是已經您的當地分支機構跟蹤?
git config -l將允許您檢查您目前設置的內容)。
(一git branch -r還可以幫助列出當前遠程跟蹤分支)。


遠程分支,我認爲有一些不同的遠程跟蹤分支。

錯誤,如圖所示由this thread

遠程分支是 「真正的」 遠程跟蹤分支。您不必在本地提交它們,它們本質上是隻讀的遠程存儲庫中正在發生的事情的副本。
如果你嘗試'git-checkout'一個遠程追蹤分支,你會得到一個分離的HEAD。

本地分支:
您可以提交更改的分支。或者,可以將分支配置爲「跟蹤」您的一個遠程跟蹤分支。這意味着沒有參數的'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 -取。 git config -l不包含遠程分支所熟悉的任何東西,而git分支-r只是列出了遠程分支,我認爲這是遠程跟蹤分支的不同之處。還是我混淆的東西? – che 2009-09-08 21:04:50

+1

感謝您的詳細回覆,因爲我正在閱讀它我認爲主要問題是我不知道我在做什麼。 – che 2009-09-09 16:18:27

+0

感謝您的詳細解答。它幫助我弄清楚,我的問題是由具有相同提取模式的2個遙控器引起的。 – dregad 2016-06-12 08:50:27

18

我看到這也是當我有兩個遠程回購與相同(默認)獲取模式(fetch = +refs/heads/*:refs/remotes/origin/*)和相同的分支。

我還沒有制定出如何正確地解決它,因爲我想繼續推/拉兩個回購的,但手動添加信息到項目的.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 2010-03-25 17:10:07

+0

非常好的一點 - 在第二個回購協議中對原產地的引用看起來不正確。 我真的需要離開並完全理解「提取」行的真正含義,所以我可以正確配置第二個回購(本質上是一面鏡子)。 – 2010-03-26 01:49:07

+3

'refs/heads/*:refs/remotes/origin/*'的含義是:在遠端的'refs/heads'中取所有遠程引用,並將'refs/heads/origin'放在我們的側。 'refs/heads'是存儲分支的路徑,所以如果你在遠程分支上有'foo'分支,它將被取到本地倉庫中的'origin/foo'。開始處的「+」意味着目標分支應該總是被覆蓋(而不是有一些額外的檢查)。 – che 2010-03-27 01:01:21

2

我遇到了這樣的情況,但我不知道如何。從git branch -av的列表中,我只看到了我關心的分支(origin/dev)的一個遠程跟蹤分支。

我做了什麼來解決它是用十六進制提交哈希,而不是origin/dev

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

當我做了-u混帳說Branch dev set up to track remote branch dev from origin.隨後拉和我的預期推壓工作的推動。

相關問題