cảnh báo: HEAD từ xa đề cập đến giới thiệu không tồn tại, không thể thanh toán


86

Đây có vẻ như là một lỗi phổ biến do các nguyên nhân khác nhau.

Tôi có một repo git trần đơn giản được gọi là "kiflea.git", tôi sao chép nó như thế này:

git clone git://kipdola.be/kiflea.git

Sau đó, git nói với tôi: warning: remote HEAD refers to nonexistent ref, unable to checkout.

Và có, không có tệp được phiên bản nào trong bản đồ, ngoại trừ thư mục .git. Dù sao, điều duy nhất tôi cần làm là:

cd kiflea
git checkout master

Và nó hoạt động, tất cả các tệp đều ở đó. Nhưng tôi nghĩ rằng sao chép một repo sẽ tự động kiểm tra bản chính, vậy chính xác thì điều gì đang xảy ra và làm cách nào để khắc phục nó?

Tôi đã nhận thấy rằng, sau khi tôi thực hiện một git checkout masterchút, điều này sẽ được thêm vào tệp cấu hình .git cục bộ của tôi:

[branch "master"]
    remote = origin
    merge = refs/heads/master

Có lẽ rất thú vị khi biết rằng kho lưu trữ git này từng là kho lưu trữ svn trong quá khứ xa xôi.

Ps: khi duyệt kho lưu trữ trần bằng gitweb, rõ ràng có một masternhánh ở đó: http://kipdola.be/gitweb/?p=kiflea.git;a=summary


2
Điều gì git ls-remote origincho thấy bạn?
CB Bailey

Nó giống nhau trước hoặc sau một checkout masterchút:25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
xiên

1
Có vẻ như kho lưu trữ từ xa đã bị mất (hoặc không bao giờ có) HEAD. Bạn có quyền truy cập trực tiếp vào nó không? Nếu vậy, hãy xem ở đây
CB Bailey

1
Nếu bạn sao chép một kho lưu trữ và không chỉ định chi nhánh, nó sẽ cố gắng sử dụng phần đầu từ xa. Như đã giải thích bên dưới trong câu trả lời, bạn không thể ảnh hưởng trực tiếp đến nhánh nào. Tuy nhiên, bằng cách kiểm tra một nhánh khác tại thời điểm sao chép, bạn sẽ tránh được việc kiểm tra này. Trong trường hợp của bạn có vẻ như chủ nhân tồn tại nhưng điểm đầu từ xa ở một nơi khác, vì vậy sử dụng:git clone -b master <url> <dir>
eckes

Câu trả lời:


125

warning: remote HEAD refers to nonexistent ref, unable to checkout.nghĩa là kho lưu trữ từ xa (trống) chứa tham chiếu nhánh trong tệp được gọi HEADkhông khớp với bất kỳ nhánh nào đã xuất bản trong cùng một kho.

Lưu ý rằng cảnh báo chỉ có nghĩa là git không thực hiện thanh toán. Nếu không thì kho lưu trữ nhân bản vẫn ổn. Chỉ cần làm git branch -ađể xem các nhánh khả thi và git checkout the-branch-you-wantgiải quyết vấn đề.

Điều này thường xảy ra bởi vì nội dung mặc định cho tệp đó ( .git/HEADhoặc thuần túy HEADcho kho lưu trữ trống) ref: refs/heads/mastercho biết rằng nếu ai đó đang truy cập clonevào kho lưu trữ này, theo mặc định, họ sẽ sao chép nhánh refs/heads/master. Theo mặc định, Git sẽ tạo nhánh cục bộ mà không có refs/heads/tiền tố (nghĩa là mastertheo mặc định). Hãy thử git help symbolic-refđể biết thêm thông tin.

Vấn đề với tình huống này là Git không cung cấp phương pháp sửa đổi các refs tượng trưng từ xa, vì vậy hoặc bạn sử dụng thứ gì đó mà nhà cung cấp dịch vụ lưu trữ Git đã triển khai (ví dụ: Cài đặt - Chi nhánh mặc định trong GitHub nếu bạn có quyền quản trị) hoặc bạn phải sử dụng tên chi nhánh masterlàm nhánh mặc định (vì đó là giá trị mặc định cho ref tượng trưng đó).

Nếu bạn có quyền truy cập shell để git repo từ xa của bạn, bạn chỉ có thể cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZở đâu XYZlà tên chi nhánh bạn muốn sử dụng theo mặc định.

Một cách để giải quyết vấn đề này là tạo một repo trần từ xa mới không có cam kết và sau đó thực hiện git push name-of-the-remote my-special-branch-name kho lưu trữ trống này sẽ dẫn đến kho lưu trữ trống chứa một nhánh duy nhất my-special-branch-namenhưng tham chiếu HEADtượng trưng vẫn chứa giá trị mặc định trỏ đến master. Kết quả là, bạn sẽ nhận được cảnh báo nói trên.


20
Lưu ý rằng cảnh báo chỉ có nghĩa là git đã không thực hiện checkout. Nếu không thì kho lưu trữ nhân bản vẫn ổn. Làm git branch -ađể xem các nhánh khả thi và git checkout the-branch-you-wantđể "khắc phục" sự cố.
Mikko Rantalainen

2
Ít nhất một người có thể tránh sử dụng đầu từ xa khi sử dụng git clone -b master(hoặc bất cứ điều gì là tên của nhánh hiện có).
eckes

Tôi đã làm chính xác những gì bạn đã viết trong đoạn trước; Có các tệp trong nhánh trong repo trần (trong gitlab) nhưng bản sao dường như trống. {git branch -a} không hiển thị gì. {git clone -b my-special-branch-name <url>} dường như cũng không hoạt động (đầu điều khiển từ xa bị treo).
Ed Randall

Tôi đã "sửa" nó bằng cách sao chép refs / remotes / my-special-branch-name thành refs / heads và chỉnh sửa HEAD cho phù hợp (trong repo gitlab trần). Sau đó, tôi có thể sao chép thành công bằng cách sử dụng -b-my-special-branch-name. Nhưng cách chính xác để cấu hình repo trống rỗng sau chu kỳ "init" / "push" để clone -b không gặp sự cố là gì?
Ed Randall

1
@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZnơi XYZlà tên chi nhánh mặc định bạn muốn được sử dụng nếu git cloneđược thực hiện mà không có -bcờ. Nếu bạn gặp một số vấn đề khác, vui lòng đặt câu hỏi mới thay vì thêm câu hỏi dưới dạng nhận xét.
Mikko Rantalainen

10

Tôi đã gặp vấn đề tương tự vì tôi không sử dụng masterchi nhánh nữa và nó bị mất trong cả kho lưu trữ cục bộ và từ xa của tôi.

Kho lưu trữ từ xa vẫn được HEADthiết lập master, tôi đã thay đổi nó thành một trong những chi nhánh từ xa mà tôi thực sự sử dụng và mọi thứ hoạt động tốt.

Nếu bạn có thể truy cập kho lưu trữ từ xa của mình:

  • Đi đến của bạn remote_repo.git;
  • Chỉnh sửa HEADtệp
  • Thay đổi ref: refs/heads/masterthànhref: refs/heads/your_branch

cả hai điều kiện đều có thể xảy ra, cái chính đã bị xóa và HEAD vẫn trỏ tới nó hoặc HEAD đã được thay đổi thành một nhánh đã bị xóa sau đó. Tôi đoán (kể từ khi kiểm tra các hoạt động chính) tùy chọn thứ hai là trường hợp của chúng tôi. @MarcoBonifazi Trong trường hợp đó, "thay đổi" sẽ được thay thế broken_branchbằng refs/heads/master.
eckes

2
có cách nào "thích hợp" để đặt nhánh HEAD như thế này mà không cần chỉnh sửa tệp không?
Ed Randall

@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZnơi XYZlà tên chi nhánh mặc định bạn muốn được sử dụng nếu git cloneđược thực hiện mà không có -bcờ, như tôi đã nói trong bình luận khác.
Mikko Rantalainen

7

Có, điều này liên quan đến bản sao git của bạn đang cố gắng kiểm tra một nhánh khác với nhánh chính. Chỉ cần làm điều này

git clone user@git-server:project_name.git -b branch_name /some/folder

Điều này sẽ giúp bạn sao chép nhánh chính xác thông qua tên nhánh của nó.


2

Mặc dù lỗi này được hiển thị - dự án của tôi vẫn được kết nối với kho lưu trữ tương ứng - tôi đã chạy git branchlệnh và thấy các nhánh thích hợp - sau đó tôi chạy git checkout *branchnamevà BOOM - tất cả đều tốt.


Vâng, @Mikko đã giải thích lý do là gì. Nếu bạn muốn bỏ qua thanh toán, bạn có thể sử dụng tùy chọn -b. (Nhưng tốt hơn là bạn nên sửa repo từ xa của bạn về lâu dài!)
eckes 16/09

1

Chắc chắn có điều gì đó sai với kho lưu trữ từ xa của bạn. Bạn có thể sửa nó bằng cách tạo một bản sao mới của kho lưu trữ. Việc đẩy một cam kết mới đến nhánh chính cũng có thể hoạt động.


Tôi đoán ý của bạn là: "git push -u origin HEAD: HEAD" Nó không giải quyết được gì cho tôi ...
RzR

1

Tôi đoán rằng phần dẫn đầu *trong bản ghi cam kết bằng cách nào đó đang đánh lừa máy chủ từ xa.

Tôi có thể duyệt qua giao diện web của repo bằng một số liên kết menu, nhưng những liên kết khác không thành công với một 404 - Unknown commit objecthoặc tương tự, đặc biệt là từ trang tóm tắt.

Xem liệu bạn có thể sửa đổi thông báo cam kết cuối cùng đó không và sau đó buộc đẩy bản cập nhật để xem liệu điều đó có khắc phục được không. Có thể có một lỗi trong con quỷ máy chủ. Nếu nó không khắc phục được, nó sẽ đáng báo cáo trên git list git@vger.kernel.org (chỉ tin nhắn văn bản thuần túy)


1

Tôi đã gặp vấn đề tương tự khi tạo một repo trần.

Tôi đã giải quyết nó bằng cách sao chép repo, tạo một nhánh chính cục bộ và sau đó đẩy chủ đến repo từ xa.

1) sao chép repo

$ git.exe clone --progress -v "the remote path" "my local path"

2) tạo một nhánh chính cục bộ.

   $ git checkout -b master

3) cam kết một cái gì đó trong chi nhánh địa phương

$ git add readme.md 
$ git commit –m “Added readme”

4) Đẩy bản gốc cục bộ trên điều khiển từ xa

   $ git push origin master

0

Nếu thực sự không có nhánh chính nào, hãy kiểm tra phần sau; Nếu có một tệp có tên 'pack-refs' bên trong thư mục '.git', hãy mở nó và bạn có thể tìm thấy tất cả các tham chiếu được liệt kê.

Một cái gì đó như dưới đây;

# pack-refs with: peeled fully-peeled 
e7cc58650190bd28599d81917f1706445d3c6d8b refs/tags/afw-test-harness-1.5
^cfae4f034e82591afdf4e5ed72279297d0eee618
6afe1bcfa4bd74de8e0c8f64d024e1cc289206df refs/tags/afw-test-harness-2.1
^c32f7fa495d4b44652f46c065fcd19c3acd237a6
72f2e4284dfbf27c82967da096c6664646bbdd19 refs/tags/android-1.6_r1
^50992e805e758e2231f28ec2127b57a1a9fd0ddc
0cbd528cad1cee9556098b62add993fc3b5dcc33 refs/tags/android-1.6_r1.1

Sau đó sử dụng;

git checkout refs/tags/xxxx

Hoặc là

git checkout 'HASH value'

để kiểm tra phiên bản được yêu cầu. Cảm ơn bạn.


0

Tôi dường như đã sửa nó bằng:

git checkout -b  master
git push

Điều này tạo ra cái chính mặc định và sau đó tôi có thể kiểm tra các nhánh khác của mình


0

Trong trường hợp của tôi, repo trống.

git checkout --orphan master

git add some_file
git commit -m 'init'
git push origin master 

0

Đối với Gitlab, ngay cả khi nó cho thấy bạn đang ở trên một nhánh mặc định (ví dụ master), bạn có thể không thực sự ở trên đó, việc đặt lại nó sẽ sửa nó, như sau:

  1. Tạo một chi nhánh mới, có thể asd
  2. cài đặt> kho lưu trữ> Chi nhánh mặc định, hiển thị chi nhánh mặc định là master
  3. Đặt nó thành asd
  4. Đặt nó trở lại master
  5. Xóa asdchi nhánh

Xong, bây giờ chi nhánh mặc định của bạn là master

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.