2009-09-08 24 views
18

Khi tôi cố gắng tạo ra theo dõi một chi nhánh từ xa một chi nhánh mới, tôi có được điều này:Tại sao git branch -t thất bại với "Not tracking: ambiguous information"?

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

The source dường như bằng cách nào đó tìm kiếm các chi nhánh để theo dõi và ném tôi ra vì nó tìm thấy ít nhiều hơn một, nhưng Tôi không chính xác nhận được những gì nó đang tìm kiếm kể từ khi tôi đã nói với nó những gì để theo dõi trên dòng lệnh.

Ai có thể cho tôi biết điều gì đang xảy ra và cách khắc phục?

+0

Chỉ cần thêm một số thuật ngữ và một số đề xuất (chỉ dẫn đến khám phá, không có gì dứt khoát) để giải thích tình hình hiện tại. – VonC

+0

Cảm ơn bạn đã phản hồi, nhưng bạn có thực sự tìm thấy lý do đằng sau thông báo lỗi của mình không? – VonC

Trả lời

10

OK! Vấn đề là tôi đã thiết lập một điều khiển từ xa với --mirror, với mục đích có một bản sao lưu/sao lưu công cộng của kho lưu trữ của tôi.

Nếu bạn chạy

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

nó không chỉ cờ điều khiển từ xa như gương (đó là những gì tôi muốn cho push), nhưng cũng có cấu hình remote.<mirror>.fetch lựa chọn cho những tấm gương để +refs/*:refs/*, điều đó có nghĩa rằng tất cả các bạn các nhánh đột nhiên "theo dõi" kho lưu trữ nhân bản của bạn và bất kỳ nỗ lực nào để tạo ra một nhánh theo dõi sẽ thất bại.

(Là một tiền thưởng thêm, chạy git fetch <mirror> sẽ ghi đè tất cả refs của bạn với những người thân cũ từ repo sao lưu của bạn.)

Các giải pháp mà dường như khắc phục vấn đề này là thiết lập remote.<mirror>.fetch-: (trong đó, tôi hy vọng , có nghĩa là "không bao giờ tìm nạp bất kỳ thứ gì"). Điều này dường như khắc phục vấn đề theo dõi và loại bỏ việc tìm nạp chết người.

+0

Tôi đã có chính xác vấn đề này, và giải pháp này cố định nó. Cảm ơn. – offby1

14

vì nó tìm thấy dưới một

Nope: vì nó tìm thấy hơn hơn một phù hợp với chi nhánh ở xa, có nghĩa là chức năng remote_find_tracking() trả chi nhánh nhiều hơn một theo dõi cho một ref chi nhánh địa phương nhất định.

some_remote_branch không đã được theo dõi bởi một trong các chi nhánh địa phương của bạn?
(một git config -l sẽ cho phép bạn kiểm tra những gì bạn hiện đã thiết lập).
(một git branch -r cũng có thể giúp để liệt kê các chi nhánh từ xa theo dõi hiện tại của bạn.)


chi nhánh từ xa, mà tôi nghĩ là một cái gì đó khác nhau mà chi nhánh từ xa theo dõi.

sai, như minh họa bởi this thread:

xa-chi nhánh là "thật" từ xa theo dõi các chi nhánh. Bạn không cam kết với chúng cục bộ, chúng chủ yếu là các bản sao chỉ đọc chính xác những gì đang xảy ra trong một kho lưu trữ từ xa.
Nếu bạn cố gắng 'git-checkout' một nhánh theo dõi từ xa, bạn sẽ nhận được HEAD tách rời.

Chi nhánh địa phương:
Chi nhánh mà bạn có thể thực hiện thay đổi. Tùy chọn, chi nhánh có thể được cấu hình để "theo dõi" một trong các nhánh theo dõi từ xa của bạn. Điều này có nghĩa là 'git-pull' không có đối số (khi chi nhánh địa phương của bạn được chọn), sẽ tự động 'git-fetch' và sau đó 'git-merge' chi nhánh theo dõi từ xa.

Bây giờ là:

nó là công việc của git-fetch để cập nhật chi nhánh từ xa theo dõi với bất kỳ thay đổi được tìm thấy trong kho lưu trữ từ xa.
Git-pull chạy git-fetch và sau đó chạy git-merge để cập nhật chi nhánh hiện đã được kiểm tra.

Vấn đề là, cho git-hợp nhất:

Khi điều này xảy ra, git-merge phải quyết định mà remote-tracking-branch sáp nhập vào hiện kiểm tra ra chi nhánh địa phương.
Bạn có thể đặt remote-tracking-branch sẽ được chọn trong trường hợp này bằng tùy chọn --track.

--track bộ lập một chi nhánh sau tại địa phương để đề cập đến chi nhánh một điều khiển từ xa, không đến chi nhánh theo dõi

Consider thatremote_find_tracking() mất một đơn từ xa và một refspec với src điền, và trả về refspec trao sau điền dst của nó, nếu một theo dõi thích hợp được cấu hình cho điều khiển từ xa, có nghĩa là 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); 

Có thể nó xem xét nó đã có một chi nhánh địa phương theo sau some_remote_branch. Bạn có bất kỳ chi nhánh địa phương nào có cùng tên chính xác không?
Hoặc, cách khác xung quanh: nhánh hiện tại của bạn có một nhánh từ xa có tên tương tự, làm cho nó trở thành một ứng cử viên tự nhiên cho bất kỳ git-merge: cố gắng làm cho nó theo dõi một chi nhánh khác từ xa sẽ làm cho git-merge không thể chọn địa phương nào để cập nhật/hợp nhất với các thay đổi của điều khiển từ xa.

+0

Tôi quản lý để viết chính xác đối diện của "nhiều hơn", nhờ chỉ ra rằng :-) Dù sao, tôi dường như nhận được tin nhắn ngay cả khi tôi cố gắng thiết lập chi nhánh địa phương từ một chi nhánh từ xa mà tôi vừa nhận được bởi git -fetch. git config -l không chứa bất kỳ thứ gì quen thuộc với nhánh từ xa, và nhánh git -r chỉ liệt kê các nhánh từ xa, mà tôi nghĩ là một cái gì đó khác với các nhánh theo dõi từ xa. Hay tôi đang nhầm lẫn? – che

+1

Cảm ơn bạn đã trả lời chi tiết, khi tôi đọc nó, tôi đoán vấn đề chính là tôi không biết mình đang làm gì. – che

+0

Cảm ơn câu trả lời chi tiết. Nó đã giúp tôi tìm ra rằng vấn đề của tôi là do có 2 điều khiển từ xa với cùng một mẫu tìm nạp. – dregad

18

Tôi cũng thấy điều này khi tôi có hai repo từ xa có cùng mẫu tìm nạp (mặc định) (fetch = +refs/heads/*:refs/remotes/origin/*) và cùng một nhánh.

tôi vẫn chưa làm việc ra làm thế nào để sửa chữa nó đúng, vì tôi muốn tiếp tục đẩy/kéo cho cả hai của repo, nhưng tay thêm thông tin để .git/config công trình của dự án, ví dụ:

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

Tôi đoán sửa chữa sẽ là có điều khiển từ xa khác nhau lấy đến những nơi khác nhau, ví dụ như. thay vì cả hai có 'fetch = + refs/heads/*: refs/remotes/origin/*', hãy thử đổi tên đích thứ hai thành một cái gì đó như 'fetch = + refs/heads/*: refs/remotes/another_repo/*' . – che

+0

Một điểm rất tốt - tham chiếu đến xuất xứ trong repo thứ hai có vẻ không đúng. Tôi thực sự cần phải biến mất và hoàn toàn hiểu những gì "tìm nạp" dòng thực sự có nghĩa là, vì vậy tôi có thể cấu hình repo thứ hai (mà về cơ bản là một tấm gương) đúng cách. –

+3

Ý nghĩa của 'refs/heads/*: refs/remotes/origin/*' là: lấy tất cả tham chiếu từ xa trong 'refs/heads' ở phía xa, và đặt vào' refs/heads/origin' trên bên. 'refs/heads' là đường dẫn nơi các nhánh được lưu trữ, vì vậy nếu bạn có nhánh' foo' trên điều khiển từ xa, nó sẽ được tìm nạp vào 'origin/foo' trong repo cục bộ của bạn. '+' Ở đầu có nghĩa là các nhánh đích phải luôn được ghi đè (w/o rằng có một số kiểm tra bổ sung). – che

2

Tôi gặp phải một tình huống như thế này, nhưng tôi không biết làm thế nào. Danh sách từ git branch -av chỉ cho tôi một chi nhánh theo dõi từ xa duy nhất cho chi nhánh mà tôi quan tâm (origin/dev).

Tôi đã làm gì để sửa chữa nó là sử dụng hệ thập lục phân cam băm thay vì origin/dev:

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

Khi tôi đã làm việc đẩy mạnh với -u Git nói Branch dev set up to track remote branch dev from origin. Kéo tiếp theo và đẩy làm việc như tôi mong đợi.

Các vấn đề liên quan