ลูกพรุนอัตโนมัติด้วย Git ดึงหรือดึง


248

หากมีคนลบสาขาระยะไกลเพราะงานจบลงแล้วและฉันไม่รู้ฉันจะไม่ทำgit fetch --pruneและในที่สุดฉันก็จะผลักสาขาที่ถูกลบกลับไป

มีวิธีแก้ปัญหาในการบังคับให้ Git ใช้โหมดพรุนเมื่อดึง / ดึงโดยไม่ต้องระบุทุกครั้งหรือไม่


1
คุณจะเร็ว ๆ นี้ (คอมไพล์ 1.8.5, Q4 2013) จะสามารถที่จะระบุในการตั้งค่าท้องถิ่น repo ที่คุณต้องการเสมอตัดบนgit fetch! ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


396

ตั้งแต่ git 1.8.5 (Q4 2013) :

" git fetch" (ด้วยเหตุนี้ " git pull" เช่นกัน) เรียนรู้วิธีตรวจสอบตัวแปรการกำหนดค่า " fetch.prune" และ " remote.*.prune" และทำตัวราวกับว่า--pruneได้รับตัวเลือกบรรทัดคำสั่ง ""

นั่นหมายความว่าหากคุณตั้งค่า remote.origin.prune เป็นจริง:

git config remote.origin.prune true

สิ่งใดgit fetchหรือgit pullจะตัดโดยอัตโนมัติ

หมายเหตุ: Git 2.12 (ไตรมาสที่ 1 ปี 2560) จะแก้ไขข้อผิดพลาดที่เกี่ยวข้องกับการกำหนดค่านี้ซึ่งจะทำให้การgit remote renameทำงานผิดพลาด
ดูที่ " ฉันจะเปลี่ยนชื่อรีโมต git ได้อย่างไร "


ดูเพิ่มเติมที่กระทำ 737c5a9 :

หากไม่มี " git fetch --prune" สาขาการติดตามระยะไกลสำหรับสาขาหนึ่งอีกด้านหนึ่งที่ลบไปแล้วจะคงอยู่ตลอดไป
บางคนต้องการเรียกใช้ " git fetch --prune" เสมอ

เพื่ออำนวยความสะดวกให้กับผู้ใช้ที่ต้องการจะตัดเป็นประจำหรือเมื่อดึงข้อมูลจากระยะไกลโดยเฉพาะให้เพิ่มตัวแปรการกำหนดค่าใหม่สองตัว " fetch.prune" และ " remote.<name>.prune":

  • " fetch.prune" อนุญาตให้เปิดใช้งานลูกพรุนสำหรับการดึงข้อมูลทั้งหมด
  • " remote.<name>.prune" อนุญาตให้เปลี่ยนพฤติกรรมต่อระยะไกล

หลังจะแทนที่อดีตโดยธรรมชาติและ--[no-]pruneตัวเลือกจากบรรทัดคำสั่งจะแทนที่ค่าเริ่มต้นที่กำหนดไว้

เนื่องจาก--pruneเป็นการดำเนินการที่อาจเป็นอันตราย (Git ยังไม่ reflogs สำหรับการอ้างอิงที่ถูกลบ) เราไม่ต้องการตัดโดยไม่ได้รับความยินยอมจากผู้ใช้ดังนั้นการกำหนดค่านี้จะไม่เปิดตามค่าเริ่มต้น


4
นี่รวมอยู่ในคอมไพล์ที่ปล่อยออกมาตอนนี้ 1.8.5 แล้ว
Bessey

1
ฉันต้องการพฤติกรรมนี้โดยค่าเริ่มต้นใน repos git ของฉันทั้งหมด มีบางอย่างที่ฉันสามารถวางไว้ใน. gitconfig ของฉันเพื่อทำให้เกิดขึ้นได้หรือไม่?
Andrew

47
@ แอนดรูว์เริ่มต้นที่ดีจะเป็นอย่างไรgit config --global fetch.prune true
VonC

1
ข้อเสียที่เป็นไปได้คือการตัดแต่งกิ่งด้วยการดึงเสมอ อ้างถึงที่อ้างถึงประวัติ reflog ได้รับผลกระทบ ... แต่ปัญหาในทางปฏิบัติที่อาจแนะนำ?
Grapho

3
@Grapho ไม่มีข้อเสียจริง แต่ ... ดูเพิ่มเติมได้ที่stackoverflow.com/a/39862779/6309
VonC

143

git config --global fetch.prune true

เสมอ--pruneสำหรับgit fetchและgit pullในที่เก็บ Git ทั้งหมดของคุณ:

git config --global fetch.prune true

คำสั่งด้านบนนี้ผนวกในการกำหนดค่า Git ทั่วโลกของคุณ (โดยทั่วไป~/.gitconfig) บรรทัดต่อไปนี้ ใช้git config -e --globalเพื่อดูการกำหนดค่าทั่วโลกของคุณ

[fetch]
    prune = true

git config remote.origin.prune true

เป็นเสมอ--pruneแต่จากที่เก็บเดียว:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

คำสั่งด้านบนนี้เพิ่มในการกำหนดค่า Git ท้องถิ่นของคุณ (โดยทั่วไป.git/config) บรรทัดด้านล่าง ใช้git config -eเพื่อดูการกำหนดค่าท้องถิ่นของคุณ

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

คุณยังสามารถใช้--globalภายในคำสั่งที่สองหรือใช้แทน--localภายในคำสั่งแรก


git config --global gui.pruneDuringFetch true

หากคุณใช้git guiคุณอาจสนใจโดย:

git config --global gui.pruneDuringFetch true

ที่ผนวก:

[gui]
    pruneDuringFetch = true

อ้างอิง

เอกสารที่เกี่ยวข้องจากgit help config:

--global

  สำหรับตัวเลือกการเขียน: เขียนไปยัง~/.gitconfigไฟล์ทั่วโลกมากกว่าที่เก็บ.git/configให้เขียนเป็น$XDG_CONFIG_HOME/git/configไฟล์หากไฟล์นี้มีอยู่และ~/.gitconfigไฟล์ไม่ได้

 

--local

  สำหรับตัวเลือกการเขียน: เขียนไปยัง.git/configไฟล์ที่เก็บ นี่คือพฤติกรรมเริ่มต้น

 

fetch.prune

  หากเป็นจริงการดึงข้อมูลจะทำงานโดยอัตโนมัติเสมือนว่า--pruneได้รับตัวเลือกในบรรทัดคำสั่ง remote.<name>.pruneดูเพิ่มเติม

 

gui.pruneDuringFetch

  "เป็นจริง" ถ้าgit-guiควรตัดกิ่งติดตามระยะไกลเมื่อทำการดึงข้อมูล ค่าเริ่มต้นคือ "false"

 

remote.<name>.prune

  เมื่อตั้งค่าเป็นจริงการดึงข้อมูลจากระยะไกลนี้โดยค่าเริ่มต้นจะลบการอ้างอิงการติดตามระยะไกลใด ๆ ที่ไม่มีอยู่ในระยะไกลอีกต่อไป (ราวกับว่ามี--pruneตัวเลือกในบรรทัดคำสั่ง) แทนที่fetch.pruneการตั้งค่าถ้ามี


1
หมายเหตุด้านข้าง: ฉันเพิ่งเรียนรู้เกี่ยวกับgit config -eและgit config -e --globalจากโพสต์นี้ ไม่มีvimคำสั่งพิมพ์ให้ชี้ไปที่พา ธ เฉพาะไปยังไฟล์ git config และต้องคิดว่าพา ธ นั้นคืออะไร
ecbrodie

1
ตอนนี้นี่คือคำตอบที่คุณสามารถใช้งานได้ ขอบคุณมาก.
sebingel

คำตอบนี้ค่อนข้างละเอียด แต่อ่านยากมากเนื่องจากการจัดรูปแบบ ฉันได้พบ "เมื่อต้องการ - ปรับการเรียก git และดึง git ในที่เก็บ Git ของคุณ: git config --global fetch.prune true" ก็ดี (พร้อมลิงก์ไปยังเอกสารที่เกี่ยวข้อง)
Thibaud Colas

19

หากคุณต้องการเสมอpruneเมื่อคุณfetchผมสามารถแนะนำการใช้นามแฝง

เพียงพิมพ์git config -eเพื่อเปิดโปรแกรมแก้ไขและเปลี่ยนการกำหนดค่าสำหรับโครงการเฉพาะและเพิ่มส่วนเช่น

[alias]
pfetch = fetch --prune   

เมื่อคุณดึงgit pfetchลูกพรุนออกมาโดยอัตโนมัติ


ฉันเข้าใจ. การดึงโดยวิธีจะใช้การดึง git และไม่ใช้ gf pfetch ... ฉันควรมีชื่อแทนการดึงโดยตรงหรือไม่
Edmondo1984

1
ฉันจะ. ด้วยวิธีนี้คุณมีทั้งตัวเลือกปกติpullและfetchเวอร์ชั่นที่ตัดแล้ว ที่จริงแล้วฉันคิดว่า (แต่ฉันไม่ได้ลอง) คุณสามารถเขียนfetch = fetch --pruneโดยตรงในส่วนนามแฝงและดังนั้นpullจะใช้การดึงข้อมูลที่ถูกตัด
ทิ้ง

2
เท่าที่ฉันรู้ว่าfetch = fetch --pruneใช้งานไม่ได้การเขียนทับคำสั่งด้วยนามแฝงไม่ได้ผลสำหรับฉัน อาจเป็นเพราะฉันใช้รุ่นเก่า (1.7.2.5)
Uipko

3
จากเอกสารกำหนดค่า git: "เพื่อหลีกเลี่ยงความสับสนและปัญหาการใช้งานสคริปต์นามแฝงที่ซ่อนคำสั่ง Git ที่มีอยู่จะถูกละเว้น"
Dewayne Christensen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.