ฉันจะเปิดไฟล์จากสาขา git อื่นได้อย่างไร


35

ฉันต้องการเปิดไฟล์จากสาขาอื่นในที่เก็บ git ปัจจุบัน ฉันได้เห็นคำถาม SO นี้แต่คำแนะนำสำหรับการรวมกับ Vim นั้นยุ่งยาก (ไปป์ Vim, เปิด stdin, ตั้งค่า filetype และอื่น ๆ ด้วยตนเอง) มีวิธีที่ง่ายกว่าที่จะเก็บการเน้นไวยากรณ์การตั้งค่าประเภทไฟล์ ฯลฯ หรือไม่?

ถ้ามันช่วย:

  • ฉันติดตั้งปลั๊กอินผู้ลี้ภัย (แม้ว่าไม่ค่อยได้ใช้)
  • ฉันไม่จำเป็นต้องแก้ไข

ไฟล์สามารถเป็นไฟล์สำหรับบัฟเฟอร์ที่เปิดอยู่ในปัจจุบันหรือไฟล์อื่น

คำตอบ:


49

คุณสามารถใช้:Gedit/ :Gsplit/ :Gvsplit/ ... กับแบบฟอร์ม{revision}:{filename}

:Gedit branch:/foo/bar.c

หมายเหตุ: :Gsplit branch:%หากไฟล์เป็นเช่นเดียวกับไฟล์ปัจจุบันคุณสามารถย่อคำสั่งเพื่อต้องการ:

มักเป็นกรณีที่ต้องการ diff ของไฟล์ปัจจุบันมากกว่าเพียงแค่เปิดไฟล์ในสาขาอื่น :Gdiff {branch}คุณสามารถทำเช่นนี้ผ่านทาง

สำหรับความช่วยเหลือเพิ่มเติมดู:

:h fugitive-:Gedit
:h fugitive-revision
:h fugitive-:Gdiff
:h c_%

นอกจากนี้คุณยังอาจต้องการตรวจสอบVimcastsตอนในFugitive ซีรีส์


สวย! อยากรู้อยากเห็น: จะเกิดอะไรขึ้นถ้าฉันแก้ไขไฟล์ที่เปิดขึ้นมา?
muru

1
@muru คุณจะสังเกตเห็นว่าบัฟเฟอร์ถูกเปิดในบัฟเฟอร์แบบอ่านอย่างเดียว (อาจสังเกตได้[RO]ในบรรทัดสถานะ)
Peter Rincker

ใช่มันอยู่ที่นั่น
muru

fugitiveต้องการพา ธ จากรูทของที่เก็บ คำตอบนี้ครอบคลุมไปแล้ว แต่ฉันคิดว่าผู้ลี้ภัยเข้าใจผิดเมื่อเราอยู่ในไดเรกทอรีย่อยของ repo
Paschalis

ที่น่าตื่นตาตื่นใจ .. ครั้งแรกที่ใช้หลบหนี .. แม้ว่าฉันจะติดตั้งเป็นเวลานาน :)
alpha_989

14

นี่เป็นสิ่งที่กว้างกว่าสิ่งที่ OP ถามเล็กน้อย แต่สำหรับคนที่ไม่ต้องการใช้ปลั๊กอินและระบบควบคุมการแก้ไขอื่น ๆ ตัวอย่างข้อมูลเล็ก ๆ นี้มีแนวโน้มที่จะทำงานได้ดี:

:new
:r! git show branch:file
:1d

มันสร้างหน้าต่างใหม่และแสดงไฟล์ที่นั่นโดยการอ่านผลลัพธ์ของคำสั่งที่กำหนดลงในบัฟเฟอร์ใหม่ หลักสูตรนี้ใช้ได้กับคำสั่งภายนอกใด ๆ ไม่ใช่แค่คอมไพล์

ตัวอย่างสำหรับ bzr (ที่ไวยากรณ์ REV สามารถระบุสาขา):

:new
:r! bzr cat -r REV file
:1d

ตัวอย่างสำหรับ hg (ไม่แน่ใจเกี่ยวกับสาขาใน hg; ใช้ไม่พอ)

:new
:r! hg cat -r REV file
:1d

ตัวอย่างสำหรับ svn (

:new
:r! svn cat file@REV
:1d

คุณอาจจะยังคงต้องการตั้งประเภทไฟล์เพื่อให้มีการเน้นไวยากรณ์เหมือนในโพสต์ SO แต่อย่างน้อยคุณก็ไม่ต้องยุ่งกับการวางท่อ

เมื่อเปิดแล้วคุณสามารถบันทึกไว้ภายใต้ชื่อใหม่ด้วย:w filenameหรือ:saveas filenameเนื่องจาก Vim จะไม่มีชื่อไฟล์สำหรับมัน หากคุณไม่ต้องการที่จะสามารถที่จะแก้ไขมันแล้วคุณยังสามารถโยนในและ:setlocal readonly / หรือ:setlocal nomodifiable

-Edit: ไฟล์อัตโนมัติ -

มันใช้งานได้อีกเล็กน้อย แต่คุณสามารถขอให้ Vim เดาประเภทไฟล์ด้วย

:filetype detect

แต่เนื่องจาก Vim ยังไม่มีชื่อจึงไม่ได้ผลดีเสมอไป (ตัวอย่างเช่นฉันดึงรหัส C มาและเดาfiltype=confได้

เราสามารถตั้งชื่อได้โดยการบันทึก แต่เราไม่ต้องการเขียนทับไฟล์ที่มีอยู่ นอกจากนี้เรายังสามารถตั้งชื่อไฟล์ (ขอบคุณ @PeterRincker!) แต่อีกครั้งเราไม่ต้องการเสี่ยงต่อการชน เนื่องจากไม่น่าเป็นไปได้ที่จะมีไฟล์ที่ทั้งชื่อไฟล์และชื่อไฟล์อยู่ด้วยกันเราจะต่อไฟล์กับตัวคั่นบางตัว

:exe "silent file " . "branch" . "-" . "file"
:filetype detect

ไหน"file"จะถูกแทนที่ด้วยชื่อไฟล์ที่เกิดขึ้นจริงและ"branch"มีชื่อสาขา

แน่นอนว่า ณ จุดนี้เราเกือบจะเขียนปลั๊กอิน ;-)

การรวมมันเข้าด้วยกันที่นี่มันเป็นฟังก์ชั่นเฉพาะทางคอมไพล์ที่คุณสามารถทิ้งไว้ใน vimrc ของคุณ:

function! GitFile(branch,file)
    new
    exe "silent r! git show " . a:branch . ":" . a:file
    1d
    exe "silent file " . a:branch . "-" . a:file
    filetype detect
    setlocal readonly     "don't allow saving
    setlocal nomodified   "allow easy quitting without saving
    setlocal nomodifiable "don't allow modification
endfunction

call GitFile("whateverBranch","myfile.c")ที่คุณสามารถห่อในคำสั่งหรือโทรโดยตรงเช่น คุณจะได้รับหน้าต่างใหม่พร้อมชื่อบัฟเฟอร์whateverBranch-myfile.c


และฉันขอให้ตรวจจับชนิดไฟล์ไวยากรณ์ ฯลฯ โดยอัตโนมัติด้วยวิธีนี้ได้หรือไม่
muru

น่าเศร้าที่ไม่ได้ทำงานอีกต่อไป ฉันอัพเดทโพสต์
John O'M

1
ฉันแนะนำให้ใช้วิธีการเสริมจากการโพสต์ @ PeterRinker ของถ้าคุณสามารถ ควรทำสิ่งดีๆมากมายที่คุณต้องการ ฉันต้องการแสดงให้เห็นว่าส่วนใหญ่ไม่ต้องการออกจากบรรณาธิการหรือจัดการกับความยุ่งยากในการรับข้อมูลและฉันรู้ว่ามีบางคนที่เกลียดการใช้ปลั๊กอิน
John O'M

1
ฉันเพิ่งเพิ่มบิตเพื่อให้สามารถตรวจจับประเภทไฟล์ มันไม่ใช่สิ่งที่คุณต้องการพิมพ์อีกต่อไป แต่สามารถทำงานเป็นส่วนเสริมกับ. vimrc ได้อย่างง่ายดาย การใช้ปลั๊กอินเฉพาะอาจยังทำงานได้ดีขึ้น
John O'M

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