2012-07-13 29 views
7

Tôi có một kho lưu trữ cục bộ lấy từ một kho lưu trữ từ xa. Chạy git pull cũng như git fetch; git merge FETCH_HEAD sử dụng để thực hiện chính xác các hành động tương tự, như dự kiến ​​từ description of git pull:Tham chiếu FETCH_HEAD không cập nhật chính xác sau khi "git fetch"

MÔ TẢ

Kết hợp thay đổi từ một kho lưu trữ từ xa vào các chi nhánh hiện hành. Trong chế độ mặc định của nó, git pull là viết tắt của git fetch, tiếp theo là git merge FETCH_HEAD.

Hiện tại, và đột ngột, chạy git fetch ngừng cập nhật tài liệu tham khảo FETCH_HEAD chính xác. FETCH_HEAD hiện bị kẹt với một cam kết cũ. Chạy git fetch tải xuống tất cả các thay đổi đối với các nhánh được theo dõi từ xa, nhưng FETCH_HEAD vẫn không thay đổi bất kể nhánh đang chạy ở đâu.

# currently in branchone 
> git fetch 

# branchone is up to date since... 
> git rev-parse branchone 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c 

# ...its in the same commit as the remote branch 
> git rev-parse origin/branchone 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c 

# however FETCH_HEAD shows something different 
> git rev-parse FETCH_HEAD 
37301df96597ac037f8e7e846fea6fc7df77bea5 

git pull vẫn thực hiện tác vụ chính xác. Tuy nhiên, chạy git fetch; git merge FETCH_HEAD sẽ làm điều gì đó khác biệt kể từ khi FETCH_HEAD trỏ đến một cam kết không chính xác.

Có bất kỳ cài đặt hoặc vấn đề nào có thể gây rối với hành vi git fetch không?

Trả lời

7

Chạy git fetch mà không có bất kỳ tùy chọn nào sẽ tìm nạp tất cả các tham chiếu trong bộ điều khiển từ xa và ghi chúng vào tệp .git/FETCH_HEAD. Nội dung của tập tin thường là trông giống như sau:

37301df96597ac037f8e7e846fea6fc7df77bea5 branch 'master' of github.com:user/repo 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c not-for-merge branch 'branchOne' of github.com:user/repo 

Khi bạn có một tập tin như thế này dưới thư mục .git, bạn có thể sử dụng nó như một tài liệu tham khảo miễn là điều đầu tiên trong tập tin đó là một trong hai 40 số hex ký tự hoặc số thập phân ngắn hơn thực tế khớp với cam kết hiện có.

# This file can be used as a reference 
> cat .git/MAGIC_HEAD 
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef lorem ipsum 
the rest does not really matter 
refrigerator 

# And thus it will be interpreted by many git commands like this 
> git rev-parse MAGIC_HEAD 
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef 

Biết được điều này chúng ta có thể thấy rằng sau khi chạy git fetch tham chiếu FETCH_HEAD sẽ quyết tâm là bất cứ điều gì sẽ xảy ra là trong dòng đầu tiên

# Assuming the already mentioned contents of .git/FETCH_HEAD 
> git rev-parse FETCH_HEAD 
37301df96597ac037f8e7e846fea6fc7df77bea5 

Có vẻ như thứ tự của các nội dung của .git/FETCH_HEAD không được bảo đảm để chứa đầu tiên tham chiếu cho nhánh hiện tại.

Bằng cách thử nó trong các kho lưu trữ khác nhau có vẻ như trong một số dòng đầu tiên luôn là nhánh hiện tại, và do đó git fetch; git merge FETCH_HEAD hoạt động như mong đợi. Trên các kho khác, tuy nhiên, nội dung của .git/FETCH_HEAD sẽ được sắp xếp khác nhau và thường là dòng đầu tiên sẽ là tham chiếu đến cam kết từ xa của một nhánh khác, do đó làm cho tham chiếu FETCH_HEAD không chính xác.

Tại sao nó hoạt động khác nhau là một bí ẩn đối với tôi.

Là một giải pháp, nếu git fetch remote_name branch_name chỉ được sử dụng nhánh cụ thể này được tìm nạp và chỉ có một dòng sẽ xuất hiện trong nội dung của .git/FETCH_HEAD, làm cho tham chiếu FETCH_HEAD luôn chính xác.

# Will only fetch branchone 
> git fetch origin branchone 

# FETCH_HEAD will contain only a single line 
> cat .git/FETCH_HEAD 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c branch 'branchOne' of github.com:user/repo 
0

Chỉ cần cố gắng buộc đầu của bạn trỏ đến cam kết/đẩy mới nhất đã được thực hiện.

Sử dụng này trên kho git của bạn:

git reset --hard [email protected]{1} 

Hy vọng điều này có thể giải quyết vấn đề của bạn, lấy này đến một điểm mà nó được sử dụng để làm việc một cách hoàn hảo như trước.

+0

sửa đổi Đáng buồn là không có. Thậm chí Reseting kho đến rất cũ có gì thay đổi trong hành vi của 'git fetch' và' FETCH_HEAD'. – LopSae

+0

Một thứ khác bạn có thể thử là xóa toàn bộ kho lưu trữ cục bộ và sao chép lại nó. Nếu không, tôi sẽ giúp bạn thêm. Tôi đang cố gắng đánh giá điều gì sai với bạn Kho lưu trữ cục bộ .. – aliasgar

+0

Trên một kho lưu trữ mới, hành vi giống nhau.Kết quả mà 'FETCH_HEAD' trỏ tới là điểm đầu tiên xuất hiện trong tệp' .git/FETCH_HEAD'. Đọc xung quanh nó có vẻ như đây là hành vi dự định, nhưng Tôi vẫn còn với sự nghi ngờ của wh y trước đó đang thực hiện 'git fetch; git merge FETCH_HEAD' hoạt động hoàn hảo trên mọi nhánh. – LopSae

0

Sau khi bạn chạy git fetch (không có đối số), FETCH_HEAD sẽ chỉ bao gồm một tham chiếu hợp lệ cho việc sáp nhập (ví dụ: không được đánh dấu là không vì mục đích hợp nhất) nếu chi nhánh địa phương hiện tại (ví dụ: HEAD) là một chi nhánh theo dõi.

Giải pháp là một trong hai làm cho chi nhánh hiện tại một chi nhánh theo dõi (xem How do you make an existing Git branch track a remote branch?) hoặc chỉ định một từ xa và một chi nhánh để lấy (ví dụ git fetch origin branch

+0

Các nhánh tôi đang làm việc trên đó tất cả các nhánh đã theo dõi một nhánh từ xa. Sau khi bạn thu hút sự chú ý của tôi câu hỏi này một lần nữa tôi làm lại câu trả lời của mình để giải thích rõ hơn tại sao tham chiếu 'FETCH_HEAD' không cập nhật chính xác. Có lẽ nó có một số sự liên quan những gì bạn đề cập đến, và dòng đầu tiên trong '.git/FETCH_HEAD' chỉ được đảm bảo trong một số trường hợp khác mà tôi không biết. – LopSae

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