Lỗi Git và khó chịu: không thể khóa thông tin / refs gây tử vong


361

Sau khi nhân bản từ kho git từ xa (tại mã tốt hơn), tôi đã thực hiện một số thay đổi, cam kết và cố gắng đẩy:

git push origin master

Lỗi với:

lỗi: không thể khóa thông tin hiện tại / refs
gây tử vong: git-http-push không thành công

Trường hợp này liên quan đến kho lưu trữ đã có.

Những gì tôi đã làm trước đây, là:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. thay đổi dữ liệu
  6. git commit

Tại 'bettercodes' tôi không có quyền truy cập vào nhật ký git.

Tôi đang sử dụng Windows. Các lỗi chi tiết là:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Tôi đã nhân bản trước, sau đó thay đổi mã và cam kết.


Không có may mắn, cùng một lỗi một lần nữa.
AnnD

Hai lý do có thể xảy ra: a) Một phiên bản khác của git đang chạy (hủy tất cả các quy trình git hoặc khởi động lại) b) thư mục .git được tạo với tư cách Quản trị viên (thử dòng lệnh quản trị viên cho hoạt động)
FractalSpace

Đối với tôi, tôi đã giải quyết lỗi bằng cách gọi git fetchtrước git pull.
Levi Fuller

1
Đó là lỗi khó chịu
RobW

Câu trả lời:


685

Đối với tôi điều này đã làm việc:

git remote prune origin

Vì câu trả lời này có vẻ giúp được rất nhiều người, tôi đã tìm hiểu một chút về những gì thực sự xảy ra ở đây. Điều này sẽ làm là loại bỏ các tham chiếu đến các nhánh từ xa trong thư mục .git/refs/remotes/origin. Vì vậy, điều này sẽ không ảnh hưởng đến các chi nhánh địa phương của bạn và nó sẽ không thay đổi bất cứ điều gì từ xa, nhưng nó sẽ cập nhật các tài liệu tham khảo địa phương mà bạn có cho các chi nhánh từ xa. Dường như trong một số trường hợp, các tham chiếu này có thể chứa dữ liệu Git không thể xử lý chính xác.


1
Tôi đã thêm một số thông tin cơ bản, nhưng tôi phải thành thật nói rằng tôi không biết chính xác lý do và cách thức hoạt động của nó :)
arno_v

1
git nguồn gốc từ xa làm việc cho tôi. Nhưng tôi đã xóa tất cả các tham chiếu trong .git / refs / điều khiển từ xa / nguồn gốc.
Isuru Madusanka

2
Đây chính xác là những gì gitgợi ý làm, nhưng tôi miễn cưỡng làm điều đó bởi vì lệnh có vẻ như nó làm điều gì đó với điều khiển từ xa.
Vứt bỏ tài khoản

4
Tôi đã chạygit gc --prune=now
Stanley Mohlala

9
Đây là git cmd LỚN mà tôi đã chạy trong một thời gian. (PS: nó đã hoạt động)
Sat Thiru

456

Bạn muốn thử làm:

git gc --prune=now

Xem https://www.kernel.org/pub/software/scm/git/docs/git-gc.html


Là --prune = bây giờ giống như --prune = tất cả? Nếu vậy, tài liệu cảnh báo rằng bạn có thể mất các đối tượng không được bảo vệ. Nếu có những đối tượng không được chăm sóc, có lẽ bạn nên cố gắng điều hòa chúng trước khi cắt tỉa.
Assaf Israel

3
Cứu người, cảm ơn bạn. git pullđã bị mắc kẹt với thông báo lỗi tương tự.
Phil Brubaker

4
Nó đã giúp ngoại lệ "lỗi git: không thể khóa ref" khi tìm nạp. Cảm ơn rất nhiều!
Alexander

9
Điều này làm việc cho tôi. Nhưng sau đó tôi phải tiếp tục thực hiện cùng một lệnh mỗi lần tôi sử dụng một gitlệnh liên quan đến điều khiển từ xa. git remote prune origingiải quyết vấn đề một lần và mãi mãi.
Keyur Golani

đã cứu ngày của tôi! Cảm ơn rất nhiều :)
Abhishek Gautam

188

Điều này xảy ra với tôi khi git remote của tôi (bitbucket.org) thay đổi địa chỉ IP của họ. Cách khắc phục nhanh là gỡ bỏ và thêm lại điều khiển từ xa, sau đó mọi thứ hoạt động như mong đợi. Nếu bạn không quen với cách gỡ bỏ và thêm lại một điều khiển từ xa trong git, đây là các bước:

  1. Sao chép URL git SSH của điều khiển từ xa hiện tại của bạn. Bạn có thể in nó đến thiết bị đầu cuối bằng lệnh này:

    git remote -v

sẽ in ra một cái gì đó như thế này:

 origin git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org:account-name/repo-name.git (push)
  1. Hủy bỏ điều khiển từ repo git địa phương của bạn:

    git remote rm origin

  2. Thêm điều khiển từ xa trở lại repo địa phương của bạn:

    git remote add origin git@server-address.org:account-name/repo-name.git


8
Tôi đã thử mọi thứ khác, như git gc, git prune, rm 'tập tin có lỗi khóa', thông tin máy chủ cập nhật git, v.v. Chỉ có câu trả lời này có hiệu quả với tôi. Đôi khi nó giống như khởi động lại windows, khởi động lại và nó sẽ hoạt động. Tương tự ở đây, chỉ cần xóa và thêm repo một lần nữa, và mọi thứ đều ổn;)
Marquinho Peli

12
Sau thủ tục trên, tôi cũng cần nói với git để theo dõi chi nhánh từ xa một lần nữa với ví dụ:git branch -u origin/master
fotinsky

Điều này đã thổi bay tất cả thông tin theo dõi từ xa của tôi trong .git / config và không thực sự hoạt động.
ThomasMcLeod

Cái này cũng có tác dụng với tôi. Tất cả những người khác đã không làm việc.
dondrzzy

42

Chạy lệnh đã git update-ref -d refs/heads/origin/branchsửa nó.


4
Lệnh đó cũng đã tạo ra mánh khóe cho tôi, mặc dù ref chi nhánh từ xa của tôi hơi khác:git update-ref -d refs/remotes/origin/my_branch
ndeslandes

Điều này làm việc cho tôi, có vẻ như đây là một vấn đề nhạy cảm trường hợp. Có hai nhánh có cùng tên được đẩy đến nguồn gốc bởi một người dùng git khác, một nhánh có tất cả chữ thường và một nhánh là trường hợp tiêu đề.
th3uiguy

24

Tôi đã sửa lỗi này bằng cách làm như sau

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Điều này giả định rằng các chi nhánh địa phương và từ xa của bạn được căn chỉnh và bạn chỉ nhận được lỗi ref là không nghiêm trọng.


12

Tôi gặp vấn đề này vì tôi ở một chi nhánh có tên tương tự như chi nhánh thượng nguồn. tức là nhánh ngược dòng được gọi example-branchvà nhánh cục bộ của tôi được gọi example-branch/backend. Giải pháp là thay đổi tên của chi nhánh địa phương của tôi như vậy:

git branch -m <new name goes here>

12

Những gì làm việc cho tôi là:

  1. Tẩy .git/logs/refs/remotes/origin/branch
  2. Tẩy .git/refs/remotes/origin/branch
  3. Chạy git gc --prune=now

1
Làm việc như người ở. Nếu bất cứ ai đang gặp vấn đề với nhánh tên tệp / thư mục thì nó thực sự đang đề cập đến tất cả các tệp / thư mục tên nhánh. Tôi hi vọng cái này giúp được!
Ankit Kesharwani

11

Điều này có lẽ được giải quyết ngay bây giờ. Nhưng đây là những gì làm việc cho tôi.

  1. Vị trí:

    • Nếu kho lưu trữ bị khóa nằm ở phía máy chủ:

      1. ssh vào kho git của bạn trên máy chủ.
      2. Đăng nhập với tư cách người dùng có quyền sửa đổi kho lưu trữ và điều hướng đến kho lưu trữ trên máy chủ của bạn.
    • Nếu kho lưu trữ bị khóa chỉ là cục bộ:

      1. Mở bàn điều khiển git và điều hướng đến thư mục kho lưu trữ.
      2. Chạy lệnh này:

        git update-server-info
        
  2. Sửa các quyền trên kho lưu trữ (từ xa hoặc / và cục bộ) nếu bạn phải. Trong trường hợp của tôi, tôi đã chmodphải777chownđểapache:apache

  3. Cố gắng đẩy lại từ kho lưu trữ cục bộ:

    git push
    

7

Đây là cách nó làm việc cho tôi.

  1. tra cứu tệp khóa Apache DAV trên máy chủ của bạn (ví dụ / var / lock / apache2 / DAVlock)
  2. xóa đi
  3. tạo lại nó với quyền ghi cho máy chủ web
  4. khởi động lại máy chủ web

Thậm chí thay thế nhanh hơn:

  1. tra cứu tệp khóa Apache DAV trên máy chủ của bạn (ví dụ / var / lock / apache2 / DAVlock)
  2. Làm trống tập tin: cat /dev/null > /var/lock/apache2/DAVlock
  3. khởi động lại máy chủ web

Đây là vấn đề của tôi. Cảm ơn vì bài đăng. Tôi đã chạy loại bỏ và cấp phép tất cả trong một shot. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely

6

Điều này có vẻ như là một vấn đề quyền - có thể bạn đã mở hai cửa sổ, thực thi với các quyền riêng biệt? Có lẽ kiểm tra quyền sở hữu của thư mục .git.

Có lẽ kiểm tra xem có mở khóa tệp nổi bật không, có thể sử dụng lsof để kiểm tra hoặc tương đương với HĐH của bạn.


3

Trong trường hợp của tôi, một nhánh được chuyển đến thư mục con và thư mục được gọi là nhánh. Git đã bối rối bởi điều đó. Khi tôi xóa chi nhánh cục bộ (trong SourceTree chỉ bằng thao tác xóa nhấp chuột phải), mọi thứ vẫn hoạt động như bình thường.


3

Trong trường hợp của tôi sau khi nhận được tin nhắn này, tôi đã thực hiện lệnh thanh toán và nhận được thông báo này:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Sau khi chạy lệnh này, tôi đã trở lại bình thường.


2

Cập nhật:

Bạn có thể cần chỉnh sửa tệp ~ / .netrc của mình:

https://bugs.launchpad.net/ubfox/+source/git-core/+orms/293553

Câu trả lời gốc:

Tại sao bạn vô hiệu hóa ssl? Tôi nghĩ rằng điều này có thể phải làm với bạn là không thể đẩy qua https. Tôi đã đặt nó trở lại và cố gắng đẩy lại:

git config –global http.sslVerify true

1

Kiểm tra xem bạn (thực tế quá trình git) có quyền truy cập vào tệp .git/info/refsvà tệp này không bị khóa bởi quy trình khác.


2
Làm thế nào để bạn kiểm tra điều đó?
Iulian Onofrei

1

Tôi gặp vấn đề này, khi tôi đang cố gắng tạo một nhánh tính năng mới có chứa tên của nhánh cũ, ví dụ: origin - Branch1 và tôi muốn tạo tính năng Branch1. Nó không có khả năng, nhưng nhánh1 / tính năng đã có.


1

Trong trường hợp của tôi, tôi phải xóa thủ công các thẻ cũ đã bị xóa trên remote.


1

Trong trường hợp của tôi, nó được kết nối với tên chi nhánh mà tôi đã tạo.

Để khắc phục sự cố tôi đã tạo một nhánh với tên mà chắc chắn không tồn tại, như:

git checkout -b some_unknown_branch

Sau đó, tôi đã xóa tất cả các chi nhánh khác của mình (không hoạt động) vì chúng chỉ là rác không cần thiết.

git branch | grep -v \* | grep -v master | xargs git branch -D

và sau đó đổi tên chi nhánh hiện tại của tôi với tên mà tôi dự định, như:

git checkout -m my_desired_branch_name

0

Trong trường hợp của bettercodes.org, giải pháp này thi vị hơn - vấn đề duy nhất có thể là quyền được giao cho các thành viên dự án. Thành viên đơn giản không có quyền viết! Vui lòng đảm bảo rằng bạn có quyền Người điều hành hoặc Quản trị viên. Điều này cần phải được đặt tại bettercodes.org tại cài đặt dự án bởi Quản trị viên, tất nhiên.


0

Tôi đã thấy lỗi này khi cố chạy git filter-branchđể tách nhiều thư mục con vào một kho lưu trữ mới, riêng biệt (như trong câu trả lời này ).

Tôi đã thử tất cả các giải pháp trên và không có giải pháp nào trong số đó có hiệu quả. Cuối cùng, tôi quyết định rằng tôi không cần phải bảo toàn các thẻ của mình trong nhánh mới và chỉ chạy:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
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.