git pull fail, không thể giải quyết tham chiếu


606

Sử dụng git 1.6.4.2, khi tôi dùng thử, git pulltôi gặp lỗi này:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

Tôi đã thử git remote prune origin, nhưng nó không giúp được gì.


Câu trả lời:


929

Hãy thử dọn dẹp kho lưu trữ cục bộ của bạn với:

$ git gc --prune=now
$ git remote prune origin

người đàn ông git-gc (1):

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

người đàn ông git-remote (1):

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            

96
Tại sao điều này làm việc? Vấn đề mà nó khắc phục là gì?
Ikke

5
Lệnh thứ hai làm việc cho tôi. Rõ ràng tôi đã có một tài liệu tham khảo bị hỏng đến một chi nhánh từ xa vừa được tạo ra. Không chắc nó đã xảy ra như thế nào, nhưng rất vui vì nó là một sửa chữa đơn giản. Cảm ơn Vitek!
JGTaylor

1
Điều này làm việc hoàn hảo! Tôi cũng thích một lời giải thích về những gì nó làm và tại sao điều này làm việc. Cảm ơn!
ArielSD

4
Sẽ git remote prune originlệnh chạy trên bản sao làm việc địa phương của tôi hoặc trên kho lưu trữ từ xa?
dùng1438038

3
@ user1438038 Không nên xóa bất kỳ chi nhánh nào và chỉ cập nhật các ref từ xa trong bản sao làm việc tại địa phương của bạn. Thêm thông tin tại đây: stackoverflow.com/questions/20106712/
Mạnh

606

Đã xảy ra với tôi là tốt. Trong trường hợp của tôi, ref xấu là master và tôi đã làm như sau:

rm .git/refs/remotes/origin/master
git fetch

Điều này làm cho git khôi phục các tập tin ref. Sau đó, mọi thứ hoạt động như mong đợi một lần nữa.


1
Tôi đã làm điều tương tự, và nó đã giải quyết vấn đề của tôi. Khi tôi mở tệp trong Notepad ++, nó đã bị hỏng rõ ràng.
Người chơi

83
đảm bảo bạn chọn tệp gây ra sự cố cho bạn thay vì chủ
bia.migueis

6
@ bia.migueis: mặc dù vậy cũng sẽ không gây hại gì nếu bạn vô tình xóa chủ nhân - nó cũng sẽ được cập nhật lần tải tiếp theo.
ness101

2
Nếu nó là một mô hình con, có thể hơi khó để tìm ref. Trước tiên hãy kiểm tra xem có phải .gitlà một thư mục ls -lahay không, xem nội dung của tệp .gittệp để tìm thư mục .git thực tế trong đó các ref. .gitnội dung tập tin trong trường hợp của tôi: gitdir: ../.git/modules/my-submodule-name
CCoder

1
Hai lần trong năm qua tôi đã quay lại để sửa lỗi này và một lần nữa, đây là cách khắc phục duy nhất thực sự hoạt động.
Ted

131

Điều này đã làm công việc cho tôi:

git gc --prune=now

5
Điều này đã làm việc. Cảm ơn vì đã cứu ngày của tôi! @Bernd Bất kỳ lời giải thích có thể có của lệnh?
nashcheez

git gc docs đang ở đây
BigRon

1
Làm việc cho tôi quá. Không cần chạygit remote prune origin
Airwavezx

87

Đối với tôi, nó hoạt động để loại bỏ các tệp đang ném lỗi từ thư mục .git/refs/remotes/origin/.


đã làm điều đó! Nhưng chỉ vì tò mò bạn có biết tại sao lỗi này lại xuất hiện không? (mọi thứ đang hoạt động tốt và đột nhiên một ngày, lỗi này xuất hiện). Và bạn có biết làm thế nào để xóa các tập tin giải quyết nó?
Shreyans

Thật tốt khi nghe điều này cũng đã sửa nó cho bạn. Thành thật mà nói tôi không biết điều gì gây ra lỗi xuất hiện. Tôi nghĩ rằng một trong các tệp trong thư mục đã không đồng bộ. Vì không có cách khắc phục nào khác mà tôi thấy có hiệu quả đối với tôi nên tôi đã sử dụng nó như là phương sách cuối cùng.
Brian van Rooijen

Làm việc tuyệt vời! Lưu ý rằng bạn phải xóa tất cả các tệp gây ra sự cố (dựa trên báo cáo lỗi bạn đang gặp phải), vì nếu bạn chỉ xóa một tệp và thử kéo nó sẽ quay lại.
Rayee Roded

1
Một trong những nguyên nhân có thể là sự cố hệ thống như tôi đã mô tả trong câu trả lời của mình . Nhiều ứng dụng GUI Git định kỳ chạy Git trên repo của bạn (để làm mới trạng thái) và nếu hệ thống của bạn gặp sự cố trong khi Git đang thao tác với các tham chiếu, chúng có thể được viết lại bằng NULLs.
David Ferenczy Rogožan

53

Thử nó:

git gc --prune=now

git remote prune origin

git pull

26
Mặc dù điều này có thể trả lời câu hỏi của tác giả, nó thiếu một số từ giải thích và / hoặc liên kết đến tài liệu. Đoạn mã thô không hữu ích lắm nếu không có một số cụm từ xung quanh chúng. Bạn cũng có thể tìm thấy làm thế nào để viết một câu trả lời tốt rất hữu ích. Vui lòng chỉnh sửa câu trả lời của bạn.
Roy Scheffers

Chính xác là điểm. Nó không đủ để đúng mã và đó là nó. Tôi hy vọng có một lời giải thích
Musikero31

1
git gc --prune = hiện cập nhật kho lưu trữ cục bộ trong khi xóa các tệp không cần thiết. Nó làm việc cho tôi tốt.
Vasyl Gutnyk

44

Thực hiện các lệnh sau:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

Chỉ trong trường hợp, nếu bạn cần biết là gì .git/refs/remotes/origin/master, bạn sẽ đọc Remotes phần trong Git Tài liệu tham khảo .


1
Bạn có thể giải thích .git / refs / remote / origin / BranchName là gì không? Giải pháp này hiệu quả với tôi
caitcoo0odes

44

Tôi chỉ muốn thêm làm thế nào nó có thể xảy ra mà một tham chiếu phá vỡ.

Nguyên nhân gốc rễ có thể

Trên hệ thống của tôi (Windows 7 64-bit), khi BSOD xảy ra , một số tệp tham chiếu được lưu trữ (rất có thể hiện đang được mở / được ghi vào khi BSOD xảy ra) được ghi đè lênNULL ký tự (ASCII 0).

Như những người khác đã đề cập, để khắc phục nó, chỉ cần xóa các tệp tham chiếu không hợp lệ đó và tìm nạp lại hoặc kéo lại kho lưu trữ.

Thí dụ

Lỗi: cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

Giải pháp: xóa tập tin%repo_root%/.git/refs/remotes/origin/some/branch


1
Kịch bản tương tự trên Windows 10 64 bit - hoạt động trong repo git khi BSOD xảy ra. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Cố gắng git pullsau khi xóa các tập tin đầu tiên trở lại fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Sau khi xóa tập tin thứ hai git pull origin masterđã thành công.
cjmcdonn

39

Tôi đã có vấn đề tương tự và giải quyết nó bằng cách đi đến tập tin bị lỗi:

\repo\.git\refs\remotes\origin\master

Tập tin này chứa đầy null, tôi đã thay thế nó bằng ref mới nhất từ ​​github.


2
Có cùng một vấn đề, nhưng các tập tin .git/refs/remotes/origin/masterchỉ là trống rỗng. Giải quyết vấn đề bằng cách loại bỏ nó.
zinovyev

38

Trong trường hợp của tôi, vấn đề đã được giải quyết sau khi tôi xóa tất cả các tệp tham chiếu xóa trong thư mục .git .

Nếu bạn nhìn vào tin nhắn, nó sẽ cho bạn biết những tập tin bạn cần xóa (cụ thể).

Các tập tin cần xóa ngồi dưới .git/refs/remotes .

Tôi vừa xóa tất cả các tập tin ở đó, và chạy gc prune

git gc --prune=now

Sau đó, mọi thứ hoạt động tốt.


Trong trường hợp của tôi, tôi chỉ cần xóa .git / refs / điều khiển từ xa, sau đó cập nhật và đẩy qua máy chủ và nó đã hoạt động.
Faraz Ahmed

Cảm ơn Uri. Trong trường hợp của tôi, tôi chỉ xóa các tệp theo refs / điều khiển từ xa / nguồn gốc / tính năng và tôi chỉ đơn giản là làm - git pull
Deepboy

26

Giải thích : Dường như các nhánh repo từ xa (trong Github / bitbucket) của bạn đã bị xóa, mặc dù các tham chiếu cục bộ của bạn không được cập nhật và trỏ đến các tham chiếu không tồn tại.

Để giải quyết vấn đề này:

git fetch --prune
git fetch --all
git pull

Để đọc thêm - Tham khảo từ tài liệu của Github :

git-fetch - Tải xuống các đối tượng và refs từ kho lưu trữ khác

--all Lấy tất cả các điều khiển từ xa.

--prune Sau khi tìm nạp, hãy xóa mọi nhánh theo dõi từ xa không còn tồn tại trên điều khiển từ xa.


1
Điều này làm việc cho tôi
Onengiye Richard

1
Cảm ơn, nó đã làm việc cho tôi.
Sam

17

git fetch --prune đã sửa lỗi này cho tôi:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

Điều này giả định rằng các chi nhánh vi phạm đã bị xóa trên điều khiển từ xa.


Ví dụ của bạn có vẻ không đầy đủ: nó không hiển thị cái --prunemà tôi có thể thấy. Ngoài ra proTip: xóa lời nhắc mật khẩu vô dụng sau khi dán ví dụ.
MarkHu

Bạn hoàn toàn đúng - Tôi đã bỏ đầu ra từ lệnh tìm nạp nhưng tôi chỉ đưa nó vào ví dụ. Cảm ơn vì mẹo xóa mật khẩu quá!
marczych

11

Nếu lỗi này không thể cập nhật giới thiệu cục bộ, thì ngay cả khi áp dụng câu trả lời của Vojtech Vitek hoặc Michel Krämer, bạn có thể có một giới thiệu xấu về kho lưu trữ cục bộ VÀ chính của mình.

Trong trường hợp này, bạn nên áp dụng cả hai cách khắc phục mà không cần kéo hoặc đẩy vào giữa ...

rm .git/refs/remotes/origin/master
git fetch
git gc --prune=now
git remote prune origin

Độ phân giải vĩnh viễn đối với tôi chỉ đạt được sau khi áp dụng cả hai cách khắc phục trước khi đẩy / kéo.


1
Cám ơn vì cái này. lưu ý rằng tôi đã thay thế 'chủ nhân' bằng chi nhánh không thành công, ví dụ: rm .git / refs / điều khiển từ xa / nguồn gốc / phát triển
Damien Sawyer

1
Cảm ơn câu trả lời của bạn, thực sự đã giúp!
naffiq

1
Điều này làm việc cho tôi
byJeevan

10

Để trả lời vấn đề này rất ngắn, vấn đề này xuất hiện khi địa phương của bạn có một số thông tin về điều khiển từ xa và ai đó thay đổi điều gì đó khiến điều khiển từ xa và thay đổi của bạn không đồng bộ.

Tôi đã gặp vấn đề này bởi vì ai đó đã xóa chi nhánh từ xa và một lần nữa được tạo ra với cùng tên.

Để xử lý các vấn đề như vậy, hãy thực hiện thao tác kéo hoặc tìm nạp từ xa.

git remote prune origin

hoặc nếu bạn đang sử dụng bất kỳ GUI nào, hãy tìm nạp từ xa.

nhập mô tả hình ảnh ở đây



3

Thử cái này:

git pull origin Branch_Name

Branch_Name, chi nhánh mà bạn hiện đang ở.

Nếu bạn chỉ làm một git pull, nó cũng kéo tất cả các tên nhánh được tạo khác.

Vì vậy, đó là lý do bạn đang nhận được điều này:

! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

2

Đối với tôi, tôi có một chi nhánh địa phương được đặt tên feature/phase2và chi nhánh từ xa được đặt tên feature/phase2/data-model. Xung đột đặt tên là nguyên nhân của vấn đề, vì vậy tôi đã xóa chi nhánh địa phương của mình (bạn có thể đổi tên nó nếu có bất cứ điều gì bạn cần giữ)


Vấn đề tương tự ở đây - vấn đề của chúng tôi cũng là vấn đề đặt tên cho trường hợp Mac / PC, khiến nó trở nên khó phát hiện (một tên được viết hoa, tên kia không - và nó hoạt động trên PC, nhưng không phải Mac)
rocksteady

2

Nếu git gc --prune=now không giúp bạn. (xui xẻo như tôi)

Những gì tôi đã làm là loại bỏ dự án tại địa phương, và sao chép lại toàn bộ dự án một lần nữa.


Đây là một "Tôi đã nhận được một thông báo lỗi vì vậy tôi đã mua một máy tính mới" -approach mà tôi không mong đợi để nhận được bất kỳ upvote nào trên trang web này.
Stephan Vierkant

2

Tôi đang sử dụng Tower và vì một số lý do tên thư mục của tôi là .git/refs/remotes/origin/Github. Thay đổi nó thành chữ thường đã .git/refs/remotes/origin/githubgiải quyết vấn đề.


1

Tôi đã có vấn đề tương tự. tôi làm theo các bước sau

1) chuyển chi nhánh của bạn có vấn đề sang chi nhánh khác

2) xóa chi nhánh đó

3) kiểm tra lại.

Lưu ý: - Bạn có thể bỏ qua các thay đổi không được cam kết và đặt lại.


1

Tôi đã sử dụng git prune originvà điều đó đã làm việc.


0

Tôi đã có cùng một vấn đề với cập nhật nhà soạn nhạc. Nhưng đối với tôi nó chỉ hoạt động sau khi tôi xóa bộ đệm của nhà soạn nhạc và sau khi xóa nội dung của thư mục nhà cung cấp:

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package

0

Có vấn đề này khi cố gắng sao chép từ một git bundletệp đã tạo, không có câu trả lời nào khác hoạt động vì tôi không thể sao chép repo (vì vậy git gcvà loại bỏ / chỉnh sửa các tệp không nằm trong câu hỏi).

Tuy nhiên, có một cách khác để khắc phục điều này - tệp nguồn của một .bundletệp đã bắt đầu bằng:

# v2 git bundle
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d HEAD
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master

PACK.......p..x...Kj.0...: (and so on...)

Đơn giản chỉ cần loại bỏ dòng thứ tư với vim đã khắc phục vấn đề.


0

Tôi đã có vấn đề này trong khi sử dụng SourceTree. Tôi đã cố gắng để kéo một lần nữa và nó đã làm việc. Tôi nghĩ rằng tôi đã phù thủy chi nhánh (thanh toán) quá nhanh :).

Tình hình của tôi hơi khác so với người gửi vì kho lưu trữ của tôi tương đối hợp tác, không có bất kỳ tham nhũng rõ ràng nào.


0
 # remove the reference file of the branch "lost"
 rm -fv ./.git/refs/remotes/origin/feature/v1.6.9-api-token-bot-reader

 # get all the branches from the master
 git fetch --all

 # git will "know" how-to handle the issue from now on
 #     From github.com:futurice/senzoit-www-server
 # * [new branch]      feature/v1.6.9-api-token-bot-reader ->
 # origin/feature/v1.6.9-api-token-bot-reader

 # and push your local changes
 git push

0

Đối mặt với cùng một vấn đề khi kho lưu trữ đã bị xóa và tạo cùng tên. Nó chỉ hoạt động khi tôi đặt lại url từ xa như bên dưới;

git nguồn gốc set-url từ xa [GIT_REPO_URL]

Xác minh url từ xa:

git remote -v

Bây giờ, tất cả các lệnh nên hoạt động như bình thường.


0

Chỉ cần chạy vào vấn đề ngày hôm nay.

Phương pháp khắc phục sự cố: Với SourceTree trên Windows Servers, bạn có thể thử chạy nó với tư cách Quản trị viên. Điều đó khắc phục sự cố của tôi về "không thể cập nhật tham chiếu cục bộ" trên Atlassian Source Tree 2.1.2.5 trên Windows Server 2012 R2 trong miền.

Nếu bạn cũng có thể sao chép tình huống này, nó chứng tỏ rằng vấn đề là do vấn đề cấp phép. Tốt hơn hết là tìm hiểu sâu và tìm ra nguyên nhân gốc - có thể một số tệp cụ thể thuộc sở hữu của người dùng khác và như vậy - nếu không thì sẽ có tác dụng phụ không mong muốn: bạn sẽ phải chạy SourceTree với tư cách là Quản trị viên vĩnh viễn.


Vâng, tôi sẽ không đề nghị điều này. Bạn sẽ kết thúc với nhiều tệp hơn với quyền không chính xác. Và bạn sẽ cần chạy mọi thứ thao tác với các tệp lưu trữ với tư cách quản trị viên. Không phải là tốt hơn chỉ đơn giản là sửa các quyền ở nơi đầu tiên?
David Ferenczy Rogožan

Bạn đúng. Nhưng chỉ sau khi làm cho nó hoạt động như một Quản trị viên, tôi mới nhận ra đó là vấn đề cấp phép. Vì vậy, đây là một bước trong quy trình chẩn đoán của tôi, không phải là một giải pháp hoàn hảo.
Lionet Chen

Chắc chắn rồi. Nhưng nhiều người dùng có thể chỉ lấy câu trả lời của bạn làm giải pháp mà không thực sự biết hậu quả. Có thể tốt hơn nếu bạn thêm việc sửa các quyền như một giải pháp được đề xuất.
David Ferenczy Rogožan

0

Viết ra một trường hợp cụ thể có thể gây ra vấn đề này.

Một ngày nọ, tôi đã đẩy một nhánh có tên là "tính năng / tính năng phụ", trong khi có nhánh "tính năng" trên điều khiển từ xa.

Hoạt động đó hoạt động tốt mà không có bất kỳ lỗi nào về phía tôi, nhưng khi đồng nghiệp của tôi tìm nạp và / hoặc kéo bất kỳ chi nhánh nào, tất cả họ đều có cùng một thông báo lỗi unable to update local ref, cannot lock ref 'refs/remotes/origin/feature/subfeature.

Điều này đã được giải quyết bằng cách xóa featurechi nhánh trên remote ( git push --delete origin feature) và sau đó chạy git remote prune origintrên repo của đồng nghiệp của tôi, nơi tạo ra các tin nhắn bao gồm * [pruned] origin/feature.

Vì vậy, dự đoán của tôi là git fetchcố gắng tạo subfeatureref trong featurethư mục trên git bên trong (.git / ...), nhưng việc tạo thư mục không thành công vì đã có featureref.


0

Chúng tôi đã gặp sự cố này khi nhà phát triển trên Mac tạo chi nhánh có ký hiệu lớn hơn ">" trong tên chi nhánh.

Điều đó gây ra sự cố trong TeamCity và trên các máy tính chạy Windows cục bộ chạy SourceTree. BitBucket cho phép nó đi qua mà không có bất kỳ vấn đề.

Để giải quyết người dùng đã loại bỏ chi nhánh và tạo lại nó. Đó là tốt đẹp và dễ dàng.


-1

Có cùng một thông điệp nhưng với một thư mục, đã có một thông báo thất bại khi kéo.

git --prone cũng không giúp tôi. Hóa ra có một tập tin có cùng tên với một thư mục được tạo từ xa.

Phải truy cập .git \ log \ refs \ remote \ origin và xóa tệp miền địa phương - sau đó kéo lại, tất cả đều tốt.

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.