Git และน่ารังเกียจ“ ข้อผิดพลาด: ไม่สามารถล็อคข้อมูลที่มีอยู่ / อ้างอิงร้ายแรง”


360

หลังจากโคลนนิ่งจากที่เก็บรีโมต git (ที่ดีกว่าโค้ด) ฉันทำการเปลี่ยนแปลงบางอย่างมุ่งมั่นและพยายามที่จะผลักดัน:

git push origin master

ข้อผิดพลาดกับ:

ข้อผิดพลาด: ไม่สามารถล็อคข้อมูลที่มีอยู่ / อ้างอิง
ร้ายแรง: git-http-push ล้มเหลว

กรณีนี้พิจารณาที่เก็บข้อมูลที่มีอยู่แล้ว

สิ่งที่ฉันทำก่อนหน้านี้คือ:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. เปลี่ยนข้อมูล
  6. git commit

ที่ 'bettercodes' ฉันไม่สามารถเข้าถึงบันทึก git

ฉันใช้ Windows ข้อผิดพลาดโดยละเอียดคือ:

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

ฉันโคลนมาก่อนจากนั้นเปลี่ยนรหัสและมุ่งมั่น


ไม่มีโชคข้อผิดพลาดเดียวกันอีกครั้ง
AnnD

สองสาเหตุที่เป็นไปได้: a) อีกตัวอย่างหนึ่งของ git กำลังทำงานอยู่ (ฆ่ากระบวนการ git ทั้งหมดหรือรีบูต) b) โฟลเดอร์. git ถูกสร้างขึ้นในฐานะผู้ดูแลระบบ (ลองใช้บรรทัดคำสั่งของผู้ดูแลระบบสำหรับการทำงาน)
FractalSpace

สำหรับฉันฉันได้รับการแก้ไขข้อผิดพลาดโดยการเรียกก่อนgit fetch git pull
Levi Fuller

1
ข้อผิดพลาดนั้นน่ารังเกียจ
RobW

คำตอบ:


683

สำหรับฉันแล้วสิ่งนี้ได้ผล:

git remote prune origin

เนื่องจากคำตอบนี้ดูเหมือนว่าจะช่วยผู้คนจำนวนมากฉันจึงขุดลงไปในสิ่งที่เกิดขึ้นจริงที่นี่ .git/refs/remotes/originสิ่งนี้จะทำคือการอ้างอิงลบไปยังสาขาที่ห่างไกลในโฟลเดอร์ ดังนั้นสิ่งนี้จะไม่ส่งผลกระทบต่อสาขาในพื้นที่ของคุณและจะไม่เปลี่ยนแปลงสิ่งใดในระยะไกล แต่จะปรับปรุงการอ้างอิงในท้องถิ่นที่คุณต้องใช้กับสาขาระยะไกล ดูเหมือนว่าในบางกรณีการอ้างอิงเหล่านี้สามารถมีข้อมูล Git ไม่สามารถจัดการได้อย่างถูกต้อง


1
ฉันได้เพิ่มข้อมูลพื้นฐานบางอย่าง แต่ผมต้องบอกว่าผมไม่ทราบว่าทำไมและวิธีการทำงานนี้ :)
arno_v

1
ต้นกำเนิดลูกพรุนระยะไกล git ทำงานสำหรับฉัน แต่ฉันได้ลบการอ้างอิงทั้งหมดใน. git / refs / remotes / origin
Isuru Madusanka

2
นี่คือสิ่งที่gitแนะนำให้ทำ แต่ฉันลังเลที่จะทำเพราะคำสั่งฟังดูเหมือนจะทำอะไรบางอย่างกับรีโมท
ทิ้งบัญชี

4
ฉันวิ่งgit gc --prune=now
สแตนลีย์ Mohlala

9
นี่คือ cmit ที่น่ากลัวที่สุดที่ฉันเคยทำงานในขณะที่ (PS: ทำงานได้)
วันเสาร์ที่

456

คุณต้องการที่จะลองทำ:

git gc --prune=now

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


Is --prune = ตอนนี้เหมือนกับ --prune = all หรือไม่ ถ้าเป็นเช่นนั้นเอกสารเตือนว่าคุณอาจสูญเสียวัตถุที่ไม่ได้เก็บไว้ หากมีวัตถุที่ไม่ได้เก็บไว้คุณควรลองปรับให้เข้ากับวัตถุก่อนทำการตัด
Assaf Israel

3
ช่วยชีวิตขอบคุณ git pullติดอยู่กับข้อผิดพลาดที่คล้ายกัน
Phil Brubaker

4
มันช่วยสำหรับข้อผิดพลาด "git: ไม่สามารถล็อก ref" ในการดึงข้อมูล ขอบคุณมาก!
Alexander

9
สิ่งนี้ใช้ได้สำหรับฉัน แต่แล้วฉันก็ต้องดำเนินการคำสั่งเดียวกันทุกครั้งที่ฉันใช้gitคำสั่งที่เกี่ยวข้องกับระยะไกล git remote prune originแก้ไขปัญหาทันทีและสำหรับทั้งหมด
Keyur Golani

บันทึกวันของฉัน! ขอบคุณมาก :)
Abhishek Gautam

188

เรื่องนี้เกิดขึ้นกับฉันเมื่อ git remote ของฉัน (bitbucket.org) เปลี่ยนที่อยู่ IP ของพวกเขา การแก้ไขอย่างรวดเร็วคือการลบและเพิ่มรีโมตอีกครั้งจากนั้นทุกอย่างทำงานตามที่คาดไว้ หากคุณไม่คุ้นเคยกับวิธีการลบและเพิ่มรีโมตในคอมไพล์อีกครั้งนี่คือขั้นตอน:

  1. คัดลอก URL git SSH ของรีโมตที่มีอยู่ของคุณ คุณสามารถพิมพ์ไปยังเทอร์มินัลโดยใช้คำสั่งนี้:

    git remote -v

ซึ่งจะพิมพ์ออกมาดังนี้:

 origin git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org:account-name/repo-name.git (push)
  1. ลบรีโมตออกจาก repo git ในพื้นที่ของคุณ:

    git remote rm origin

  2. เพิ่มรีโมตกลับไปยัง repo ในพื้นที่ของคุณ:

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


8
ฉันลองทุกอย่างอื่นแล้วเช่น git gc, gune prune, rm 'ไฟล์ที่มีข้อผิดพลาดในการล็อค', ข้อมูล git update server ฯลฯ เท่านั้นคำตอบนี้ใช้ได้สำหรับฉันเท่านั้น บางครั้งมันก็เหมือนหน้าต่างรีบูต, รีบูตและมันจะทำงาน เหมือนกันที่นี่เพียงแค่ลบและเพิ่ม repo อีกครั้งและทุกอย่างเป็นไปได้;)
Marquinho Peli

12
หลังจากขั้นตอนข้างต้นฉันต้องบอก git เพื่อติดตามสาขาระยะไกลอีกครั้งด้วยเช่น:git branch -u origin/master
fotinsky

นี่เป็นการลบข้อมูลการติดตามระยะไกลทั้งหมดของฉันใน. git / config และใช้งานไม่ได้จริง ๆ
ThomasMcLeod

สิ่งนี้ใช้ได้สำหรับฉันเช่นกัน คนอื่น ๆ ทั้งหมดไม่ทำงาน
dondrzzy

42

การรันคำสั่งgit update-ref -d refs/heads/origin/branchซ่อมมัน


4
คำสั่งนั้นใช้กลอุบายสำหรับฉันเช่นกันถึงแม้ว่าการอ้างอิงสาขาระยะไกลของฉันจะแตกต่างออกไปเล็กน้อย:git update-ref -d refs/remotes/origin/my_branch
ndeslandes

สิ่งนี้ได้ผลสำหรับฉันดูเหมือนว่านี่เป็นปัญหาเรื่องความอ่อนไหว มีสองสาขาที่มีชื่อเดียวกันที่ถูกผลักดันให้กำเนิดโดยผู้ใช้ git อีกรายหนึ่งมีตัวพิมพ์เล็กทั้งหมดและอีกชื่อหนึ่งเป็นชื่อเรื่อง
th3uiguy

24

ฉันแก้ไขสิ่งนี้โดยทำสิ่งต่อไปนี้

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

สิ่งนี้จะถือว่าสาขาท้องถิ่นและสาขาระยะไกลของคุณอยู่ในแนวเดียวกันและคุณเพิ่งได้รับข้อผิดพลาดจากการอ้างอิงว่าไม่ร้ายแรง


12

ฉันมีปัญหานี้เพราะฉันอยู่ในสาขาที่มีชื่อคล้ายกับสาขาต้นน้ำ คือสาขาต้นน้ำถูกเรียกและสาขาท้องถิ่นของฉันถูกเรียกว่าexample-branch example-branch/backendวิธีแก้ปัญหาคือเปลี่ยนชื่อสาขาในพื้นที่ของฉัน:

git branch -m <new name goes here>

11

นี่อาจแก้ไขได้ในตอนนี้ แต่นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

  1. สถานที่ตั้ง:

    • หากพื้นที่เก็บข้อมูลที่ล็อคอยู่บนฝั่งเซิร์ฟเวอร์:

      1. ssh ไปยังที่เก็บ git ของคุณบนเซิร์ฟเวอร์
      2. เข้าสู่ระบบในฐานะผู้ใช้ที่มีสิทธิ์ในการแก้ไขที่เก็บและนำทางไปยังที่เก็บบนเซิร์ฟเวอร์ของคุณ
    • หากพื้นที่เก็บข้อมูลที่ล็อคเป็นท้องถิ่นเท่านั้น:

      1. เปิดคอนโซล git และนำทางไปยังไดเรกทอรีที่เก็บ
      2. เรียกใช้คำสั่งนี้:

        git update-server-info
        
  2. แก้ไขสิทธิ์บนที่เก็บ (ระยะไกลหรือ / และท้องถิ่น) ของคุณหากคุณต้องการ ในกรณีของฉันฉันต้องchmodไป777และchownไปapache:apache

  3. ลองกดอีกครั้งจากที่เก็บในเครื่อง:

    git push
    

10

สิ่งที่ทำงานให้ฉันคือ:

  1. ลบ .git/logs/refs/remotes/origin/branch
  2. ลบ .git/refs/remotes/origin/branch
  3. วิ่ง git gc --prune=now

1
ทำงานเหมือนจับใจ หากทุกคนประสบปัญหากับสาขา / ชื่อไฟล์จากนั้นจริงๆแล้วมันหมายถึงไฟล์ / โฟลเดอร์ชื่อสาขาทั้งหมด ฉันหวังว่านี่จะช่วยได้!
Ankit Kesharwani

7

นี่คือวิธีการทำงานสำหรับฉัน

  1. ค้นหาไฟล์ล็อค Apache DAV บนเซิร์ฟเวอร์ของคุณ (เช่น / var / lock / apache2 / DAVlock)
  2. ลบมัน
  3. สร้างมันใหม่ด้วยสิทธิ์การเขียนสำหรับเว็บเซิร์ฟเวอร์
  4. รีสตาร์ทเว็บเซิร์ฟเวอร์

ทางเลือกที่เร็วยิ่งขึ้น:

  1. ค้นหาไฟล์ล็อค Apache DAV บนเซิร์ฟเวอร์ของคุณ (เช่น / var / lock / apache2 / DAVlock)
  2. ล้างไฟล์: cat /dev/null > /var/lock/apache2/DAVlock
  3. รีสตาร์ทเว็บเซิร์ฟเวอร์

นี่คือปัญหาของฉัน ขอบคุณสำหรับการโพสต์ ฉันรันการลบและการอนุญาตทั้งหมดในนัดเดียว #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely

6

ดูเหมือนว่าปัญหาเรื่องการอนุญาต - เป็นไปได้ไหมที่คุณเปิดหน้าต่างสองบานดำเนินการโดยมีสิทธิ์แยกต่างหาก? อาจตรวจสอบความเป็นเจ้าของโฟลเดอร์. git

บางทีตรวจสอบเพื่อดูว่ามีการล็อคไฟล์ค้างเปิดหรือไม่อาจใช้ lsof เพื่อตรวจสอบหรือเทียบเท่าสำหรับระบบปฏิบัติการของคุณ


3

ในกรณีของฉันสาขาถูกย้ายไปยังไดเรกทอรีย่อยและไดเรกทอรีถูกเรียกว่าเป็นสาขา Git รู้สึกสับสน เมื่อฉันลบสาขาท้องถิ่น (ใน SourceTree เพียงแค่คลิกขวาลบ) ทุกอย่างทำงานตามปกติ


3

ในกรณีของฉันหลังจากได้รับข้อความนี้ฉันได้ทำคำสั่งcheckoutและได้รับข้อความนี้:

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

หลังจากรันคำสั่งนี้ฉันก็กลับมาเป็นปกติ


2

ปรับปรุง:

คุณอาจต้องแก้ไขไฟล์ ~ / .netrc ของคุณ:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

คำตอบเดิม:

ทำไมคุณปิดใช้งาน ssl ฉันคิดว่าสิ่งนี้อาจเกี่ยวข้องกับคุณที่ไม่สามารถผลักดันผ่าน https ได้ ฉันจะตั้งมันกลับมาแล้วลองผลักอีกครั้ง:

git config –global http.sslVerify true

1

ตรวจสอบว่าคุณ (กระบวนการคอมไพล์จริง) มีการเข้าถึงไฟล์.git/info/refsและไฟล์นี้ไม่ได้ถูกล็อคโดยกระบวนการอื่น


2
คุณตรวจสอบได้อย่างไร
Iulian Onofrei

1

ฉันมีปัญหานี้เมื่อฉันพยายามสร้างสาขาฟีเจอร์ใหม่ที่มีชื่อสาขาเก่าเช่นต้นกำเนิด - branch1 และฉันต้องการสร้างฟีเจอร์ branch1 มันไม่ได้เป็นไปได้ แต่ branch1 / คุณสมบัติเป็นอยู่แล้ว


1

ในกรณีของฉันฉันต้องลบแท็กเก่าด้วยตนเองซึ่งถูกลบออกจากระยะไกล


1

ในกรณีของฉันมันเชื่อมต่อกับชื่อสาขาที่ฉันสร้างไว้แล้ว

ในการแก้ไขปัญหาฉันได้สร้างสาขาที่มีชื่อที่ไม่ควรมีอยู่เช่น:

git checkout -b some_unknown_branch

จากนั้นฉันก็เคลียร์สาขาอื่น ๆ ของฉัน (ไม่เปิดใช้งาน) เพราะเป็นเพียงขยะที่ไม่จำเป็น

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

แล้วเปลี่ยนชื่อสาขาปัจจุบันของฉันด้วยชื่อที่ฉันต้องการเช่น:

git checkout -m my_desired_branch_name

0

ในกรณีของ bettercodes.org การแก้ปัญหาคือบทกวีที่มากขึ้น - ปัญหาเดียวอาจอยู่ในสิทธิ์ที่ได้รับมอบหมายให้สมาชิกโครงการ สมาชิกแบบง่าย ๆ ไม่มีสิทธิ์ในการเขียน! โปรดตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ผู้ดูแลหรือผู้ดูแลระบบ จำเป็นต้องตั้งค่านี้ที่ bettercodes.org ในการตั้งค่าโครงการโดยผู้ดูแลระบบ


0

ฉันเห็นข้อผิดพลาดนี้เมื่อพยายามเรียกใช้git filter-branchเพื่อแยกไดเรกทอรีย่อยมากมายเป็นที่เก็บใหม่แยกต่างหาก (เช่นในคำตอบนี้ )

ฉันลองวิธีแก้ไขทั้งหมดข้างต้นแล้วและไม่สามารถแก้ไขได้เลย ในที่สุดฉันตัดสินใจว่าฉันไม่จำเป็นต้องเก็บแท็กของฉันทั้งหมดที่ไม่ดีในสาขาใหม่และเพิ่งวิ่ง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.