คุณจะลบการอ้างอิงสาขาระยะไกลที่ไม่ถูกต้องออกจาก Git ได้อย่างไร


731

ใน repo ปัจจุบันของฉันฉันมีผลลัพธ์ต่อไปนี้:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

ฉันต้องการลบremotes/public/masterจากรายการสาขา:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

นอกจากนี้ผลลัพธ์ของgit remoteมันแปลกเพราะมันไม่ได้แสดงpublic:

$ git remote show 
origin

ฉันจะลบ 'รีโมท / สาธารณะ / มาสเตอร์' จากรายการสาขาได้อย่างไร

อัปเดตลองgit pushคำสั่ง:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
ไม่git remote prune [remote-name]หรือgit fetch -p [remote-name]ไม่ทำงานในสถานการณ์ของคุณหรือไม่ การทำเช่นgit gcนี้มีพลังมากกว่าที่จำเป็นตามปกติ
rjmunro

6
git remote prune [remote-name]จะไม่ทำงานกับ git svn แม้ว่าจะไม่มีgit gc... git branch -rd origin/nameทำงานได้ @ กรณีที่คุณอาจเลือกคำตอบที่สอง - มันอันตรายน้อยกว่าเล็กน้อย
naught101

4
ฉันรักคำถามนี้ กลับมาเกือบทุกเดือน
oluckyman

ที่เกี่ยวข้องถ้าไม่ได้เป็นเป้าหมายล่อ: ลบสาขา Git ทั้งในประเทศและจากระยะไกล

2
เพื่อหลีกเลี่ยงข้อผิดพลาดของ gitter n00b ในอนาคตฉันขอแนะนำให้ใช้สาขาตัวอย่างที่แตกต่างจากmaster... โดยเฉพาะเมื่อทำการลบบนรีโมต
absynce

คำตอบ:


743

คุณอาจต้องล้างข้อมูล:

git gc --prune=now

หรือคุณอาจต้องการลูกพรุน:

git remote prune public

พรุน

ลบสาขาการติดตามเก่าทั้งหมดใน <name> กิ่งก้านเก่าเหล่านี้ได้ถูกลบออกจากที่เก็บระยะไกลที่อ้างอิงโดย <name> แต่ยังคงมีอยู่ในเครื่องใน "remotes / <name>"

ด้วยตัวเลือก - ทำงานแห้งให้รายงานว่าจะตัดกิ่งสาขาใด แต่อย่าตัดออกจริง ๆ

อย่างไรก็ตามปรากฏว่าสิ่งเหล่านี้ควรได้รับการทำความสะอาดก่อนหน้าด้วย

git remote rm public 

RM

ลบชื่อระยะไกล <name> สาขาการติดตามระยะไกลทั้งหมดและการตั้งค่าการกำหนดค่าสำหรับระยะไกลจะถูกลบออก

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

อาจเรียกใช้อีกครั้งและดูว่าเกิดอะไรขึ้น


บริบทคำแนะนำ

หากคุณดูในบันทึกการแก้ไขคุณจะทราบว่าฉันแนะนำเทคนิค "ถูกต้อง" เพิ่มเติมซึ่งด้วยเหตุผลใดก็ตามที่ไม่ต้องการทำงานในพื้นที่เก็บข้อมูลของพวกเขา

ฉันสงสัยว่าผู้ปฏิบัติการได้ทำอะไรบางอย่างที่ทำให้ต้นไม้ของพวกเขาอยู่ในสภาพไม่คงเส้นคงวาซึ่งทำให้มันมีพฤติกรรมแปลก ๆ และgit gcจำเป็นต้องแก้ไขทางด้านซ้ายหลัง cruft

โดยปกติแล้ว git branch -rd origin/badbranchจะเพียงพอสำหรับการเลี้ยงสาขาการติดตามในท้องที่หรือgit push origin :badbranchสำหรับการเลี้ยงสาขาระยะไกลและโดยปกติแล้วคุณไม่จำเป็นต้องโทรหาgit gc


4
ฉันไม่ต้องการลบสาขาทางด้านระยะไกล ฉันคิดว่ามีความแตกต่างที่ลึกซึ้ง
cmcginty

2
เอ่อคำถามนี้ถามอย่างมีประสิทธิภาพ "ฉันจะลบสาขาระยะไกลได้อย่างไร" นั่นคือเส้นทางเหล่านั้น
Kent Fredric

1
ฉันจะเรียบเรียงหัวข้อใหม่หากนั่นทำให้ชัดเจนยิ่งขึ้นในสิ่งที่ฉันขอ แต่คำสั่งแสดงให้เห็นว่าปัญหาของฉันคืออะไร
cmcginty

40
git gcไม่จำเป็นต้องใช้ที่นี่ แต่git remote pruneทำให้ฉันรู้สึกปลอดภัยกว่าการลบสิ่งต่าง ๆ ด้วยตัวgit branch -rdเองเนื่องจาก git กำลังตรวจสอบว่าสาขาใดที่ทำจากระยะไกล
Mike Seplowitz

3
สิ่งนี้ไม่ได้ผลสำหรับฉัน - 'git branch -rd' ทำงานได้ดีอย่างไรก็ตาม
dsummersl

683

สิ่งที่คุณต้องทำคือ

git fetch -p

มันจะลบสาขาท้องถิ่นของคุณทั้งหมดที่ถูกลบจากระยะไกล

หากคุณใช้ git 1.8.5+ คุณสามารถตั้งค่านี้โดยอัตโนมัติ

git config fetch.prune true

หรือ

git config --global fetch.prune true

7
นี่คือสิ่งที่ฉันกำลังมองหาเช่นกัน - คำถามอธิบายสถานการณ์ที่ซับซ้อนกว่าสถานการณ์ทั่วไป
rjmunro

22
ฉันกำลังมองหาวิธีที่จะลบสาขาในพื้นที่ที่ลบรีโมตที่เกี่ยวข้อง แต่มันใช้ไม่ได้สำหรับฉัน มีความคิดอะไรบ้าง
jackocnr

11
การดำเนินการนี้จะลบสาขาที่ระบุในรีโมต / กำเนิด แต่ไม่ลบสาขาการติดตามโลคัลซึ่งสำคัญ
BlueRaja - Danny Pflughoeft

@Cupcake เนื่องจากคุณไม่ได้ย้อนกลับการแก้ไขครั้งแรกของฉัน (ซึ่งแก้ไขข้อมูลที่ไม่ถูกต้องเกี่ยวกับ Git 1.8.5+) ตอนนี้คุณทำให้สิ่งนี้ไม่ถูกต้อง การแก้ไขครั้งที่สองของฉันกำลังแก้ไขสิ่งที่ฉันใส่ในสิ่งที่ไม่ถูกต้องซึ่งตอนนี้มีอีกครั้ง (ด้วยการย้อนกลับของคุณ) โปรดดำเนินการต่อและย้อนการแก้ไขอีกหนึ่งรายการเพื่อให้มีต้นฉบับ ขอบคุณ
ferventcoder

@ferventcoder ฉันตรวจสอบการแก้ไขล่าสุดของคุณอีกครั้งและย้อนกลับ OP สามารถย้อนกลับได้อีกครั้งถ้าเขาไม่ชอบ ขอบคุณ

319
git push public :master

นี่จะเป็นการลบสาขาระยะไกลที่ชื่อว่าmasterKent Fredric ได้ชี้ให้เห็น

ในการแสดงรายการสาขาติดตามระยะไกล:

git branch -r

หากต้องการลบสาขาติดตามระยะไกล:

git branch -rd public/master

6
สิ่งนี้ช่วยให้ฉันลบสาขาผีรีโมต git-svn
Nick

9
git branch -rd removed_remote/branchทำงานให้ฉันในขณะที่git gc --prune=nowไม่มีค่า
rchampourlier

2
ฉันสามารถใช้งานได้git pruneโดยไม่มีปัญหาใด ๆ แต่เพื่อนร่วมงานของฉันที่แยกรายการหลักของเรา ** เท่านั้นสามารถใช้git branch -rd public/masterโซลูชันสไตล์เพื่อล้างสภาพแวดล้อมของเขา
Abel

3
git branch -rd public/masterเป็นสิ่งที่ฉันขาดหายไป ฉันมีheroku/masterและherkou/master... ฮ่า ๆ woops
แอรอน

@rchampourlier ไม่ไร้ค่า 100% - ถ้า repo git ของคุณใหญ่การลบกิ่งที่ไม่ได้ใช้สามารถเพิ่มพื้นที่ดิสก์ได้มากมายในบางสถานการณ์
peterh - Reinstate Monica

159

สิ่งที่คุณต้องทำคือ

$ git branch -rd origin/whatever 

มันง่ายมาก ไม่มีเหตุผลที่จะเรียก gc ที่นี่


1
คุณจะ "ดัน" ที่ลบไปยัง GitHub ได้อย่างไร?
Thufir

14
@ Thufir นั่นไม่ใช่สิ่งที่คำถามนี้เกี่ยวกับ คำถามนี้เป็นคำถามเฉพาะสำหรับสถานการณ์เมื่อคุณมีการอ้างอิงระยะไกลที่ไม่ถูกต้องใน repo ท้องถิ่น แต่สาขานั้นไม่มีอยู่ในเซิร์ฟเวอร์ระยะไกล คำตอบสำหรับคำถามของคุณคือต้นกำเนิดการผลักดัน $ git: อะไรก็ตาม
jpswain

ใช่ถ้ามีสิ่งใดเกิดขึ้นใน repo ระยะไกลที่มีการลบสาขา แต่คุณยังคงมีการอ้างอิงถึงสาขาระยะไกลนั้นในเครื่องท้องถิ่นของคุณคุณจะต้องทำสิ่งที่ฉันใส่ไว้ในคำตอบเดิมเพื่อทำความสะอาด
jpswain

6
หากคุณมีงานการล้างข้อมูลขนาดใหญ่ (รีโมทจำนวนมากห้อยอยู่) คุณสามารถลบสาขาระยะไกลทั้งหมดด้วยบางสิ่งเช่นgit branch -rd $(git branch -r)จากนั้นทำการสร้างงานที่ถูกต้องขึ้นมาใหม่ด้วยการดึงข้อมูล
โนเบิล

สถานการณ์ของฉันคือฉันเคยgit config -eเปลี่ยนชื่อรีโมต ผมเปลี่ยนชื่อเป็นระยะไกลไปmine originนี่เป็นวิธีแก้ปัญหาที่ดีที่สุดสำหรับฉัน:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu

70

git gc --prune=now ไม่ใช่สิ่งที่คุณต้องการ

git remote prune public

หรือgit remote prune origin# ถ้านั่นคือแหล่งที่มาระยะไกล

คือสิ่งที่คุณต้องการ


6
@Casey $ git gc # ชอบการจัดเรียงข้อมูลสำหรับไฟล์ git เพื่อเพิ่มความเร็วในแหล่งเก็บข้อมูลต้นกำเนิดระยะไกลพรุน $ git # จะล้างการลบกิ่งระยะไกลเก่าที่แสดงด้วย "git branch -r | grep origin" นั่นคือคำถามที่ถามว่าฉันเชื่อ ดังนั้นคำสั่งต่างกันโดยสิ้นเชิง
tongueroo

29

คำตอบที่ยอมรับไม่ได้สำหรับฉันเมื่อการอ้างอิงถูกบรรจุ อย่างไรก็ตามสิ่งนี้:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

ทำงานให้ฉัน ปกติ git branch -d ไม่ทำงานส่งคืนข้อผิดพลาดที่ไม่มีสาขาเนื่องจากฉันลบต้นกำเนิดที่เรียกว่า "ต้นฉบับ" ที่สร้างขึ้นโดยไม่ได้ตั้งใจโดยตรงในไฟล์. git / config
micrub

นี่เป็นวิธีที่ฉันต้องใช้เพื่อลบสาขาที่ถูกตัดออกโดยไม่ตั้งใจจาก. git / config ของฉัน (ซึ่งจะต้องถูกสร้างใหม่เนื่องจากความเสียหายที่ไม่เกี่ยวข้อง) มันแย่มากคำตอบนี้อยู่ไกลจากโซ่จนฉันไม่ได้สังเกตจนกระทั่งในที่สุดฉันก็ได้พบวิธีแก้ปัญหาและไปเพิ่มคำตอบที่ยอมรับ!
taranaki

นี่คือสิ่งที่ฉันต้องการหลังจากใช้ svn2git มีรีโมต / svn / * จำนวนมาก ต้องสร้างรีโมตปลอม 'ก่อน'
Sam

7

.git/packed-refsในกรณีของผมผมพยายามที่จะลบรายการที่ถูกบันทึกไว้ใน คุณสามารถแก้ไขไฟล์ข้อความธรรมดาและลบรายการจากมันgit br -Dไม่ทราบวิธีการสัมผัส (อย่างน้อยในเวอร์ชั่น 1.7.9.5)

ฉันพบโซลูชันนี้ที่นี่: https://stackoverflow.com/a/11050880/1695680


ว้าวสิ่งนี้ช่วยฉันได้ เพื่อนร่วมงานของฉันพยายามรีสตาร์ท VS รีสตาร์ทคอมพิวเตอร์อะไรของเขาทำงานเขาลบ repo และดึงท้องถิ่นทุกอย่างของเขาที่จะได้รับการกำจัดนี้ :)
Esen

1
วันนี้ฉันขอย้ำว่าไฟล์ที่ถูกแพ็กอัดแน่นนี้ถูกสร้างขึ้นเป็นส่วนหนึ่งgit gcเมื่อมันแพ็คคำมั่นของคุณลงในไฟล์บีบอัดที่มีการบีบอัดสูงมันก็ย้ายการอ้างอิงไปยังไฟล์ข้อความธรรมดาเพียงไฟล์เดียว ฉันหวังว่าคอมไพล์รุ่นอนาคตสามารถgit br -D ...บรรจุผู้อ้างอิงได้
ThorSummoner


3

ฉันไม่รู้เกี่ยวกับgit branch -rdดังนั้นวิธีที่ฉันแก้ไขปัญหาเช่นนี้สำหรับตัวฉันเองก็คือปฏิบัติต่อ repo ของฉันในฐานะ repo ระยะไกลและทำการลบจากระยะไกล git push . :refs/remotes/public/master. หากวิธีการอื่นไม่ทำงานและคุณมีการอ้างอิงแปลก ๆ ที่คุณต้องการกำจัดวิธีดิบนี้แน่นอน มันให้ความแม่นยำที่แน่นอนในการลบ (หรือสร้าง!) การอ้างอิงใด ๆ


2

เกี่ยวข้องเพียงเล็กน้อยเท่านั้น แต่ยังอาจมีประโยชน์ในสถานการณ์เดียวกับที่เรามี - เราใช้ไฟล์เครือข่ายที่ใช้ร่วมกันสำหรับที่เก็บระยะไกลของเรา สัปดาห์ที่ผ่านมาสิ่งต่าง ๆ ใช้งานได้ในสัปดาห์นี้เราได้รับข้อผิดพลาด "ต้นกำเนิดระยะไกลไม่ได้อ้างอิง Ref สำหรับสาขา refs / หัว / หลักอ้างอิงนี้อาจไม่มีอยู่ในระยะไกลหรืออาจถูกซ่อนโดยการตั้งค่าสิทธิ์"

แต่เราเชื่อว่าไม่มีการกระทำใดที่จะทำให้เกิดความเสียหาย NFS ทำสแน็ปช็อตดังนั้นฉันจึงตรวจสอบแต่ละ "เวอร์ชันก่อนหน้า" และเห็นว่าสามวันที่ผ่านมาขนาดของหน่วยเก็บข้อมูล MB ได้เพิ่มขึ้นจาก 282MB เป็น 33MB และมีไฟล์ใหม่ประมาณ 1,403 ไฟล์และ 300 โฟลเดอร์ ฉันสอบถามเพื่อนร่วมงานของฉันและมีคนพยายามผลักดันวันนั้น - จากนั้นก็ยกเลิก

ฉันใช้ฟังก์ชั่น "กู้คืน" NFS เพื่อกู้คืนก่อนวันที่และตอนนี้ทุกอย่างทำงานได้ดีอีกครั้ง ก่อนหน้านี้ฉันลองพรุนแล้วดูเหมือนจะไม่ช่วยอะไร บางทีการล้างข้อมูลที่ยากขึ้นอาจทำงานได้

หวังว่าสิ่งนี้จะช่วยให้คนอื่นวันหนึ่ง!

คนโง่


2

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

แนวคิดสุดท้ายของฉันคือการลบการอ้างอิงทั้งหมดด้วยมือ

สมมติว่าที่เก็บข้อมูลชื่อ "Repo" ฉันทำ:

find .git -name Repo 

ดังนั้นฉันจึงลบไฟล์และไดเรกทอรีที่เกี่ยวข้องออกจากโฟลเดอร์. git ( สามารถพบโฟลเดอร์นี้ได้ในแอพ Rails หรือในคอมพิวเตอร์ของคุณ https://stackoverflow.com/a/19538763/6638513 )

จากนั้นฉันก็:

grep Repo -r .git

พบไฟล์ข้อความบางไฟล์ที่ฉันลบบรรทัดที่เกี่ยวข้อง ตอนนี้ดูเหมือนว่าทุกอย่างจะดี

โดยปกติคุณควรออกจากงานนี้เพื่อคอมไพล์

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