คอมไพล์เติมอัตโนมัติสำหรับ * สาขา * ที่บรรทัดคำสั่ง?


350

บนเครื่องลีนุกซ์ฉันมีการเติมข้อความอัตโนมัติให้กับสาขาด้วย Git

[หมายเหตุเรากำลังพูดถึงการทำให้สาขา git เสร็จสมบูรณ์ไม่ใช่การทุบตีเสร็จสิ้น (เช่นคำสั่งไฟล์ ฯลฯ ) ดังนั้นจึงไม่ใช่คำตอบของ Lane ]

ตัวอย่างเช่นฉันสามารถพิมพ์git checkout+ TABและรับรายการสาขา

หรือฉันสามารถพิมพ์git checkout feb*+ TABเพื่อให้ได้สาขาทั้งหมดที่ขึ้นต้นด้วย "feb"

ฉันจะใช้ฟังก์ชันนี้ใน Mac ได้อย่างไร

ฉันพยายามดาวน์โหลดและเรียกใช้bash-completion/bash_completionและbash-completion/bash_completion.sh.inแต่ไม่มีความสุข declare: -A invalid_optionเป็นครั้งแรกที่ทำให้ข้อความผิดพลาดเกี่ยวกับ ครั้งที่สองก็ไม่มีข้อผิดพลาด เมื่อฉันgit checkout+ TABแม้ว่าฉันยังคงได้รับรายการไฟล์ในไดเรกทอรีไม่ใช่สาขา ฉันอยู่ในรูทโครงการ

การเติมข้อมูลอัตโนมัติสำหรับคำสั่งไดเรกทอรีและ bash นั้นใช้งานได้ดังนั้นมันจึงเฉพาะเจาะจงกับ Git

คำตอบ:


483

ตกลงดังนั้นฉันต้องการสคริปต์เติมข้อความอัตโนมัติของคอมไพล์

ฉันได้สิ่งนั้นจาก url นี้:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

ไม่ต้องกังวลเกี่ยวกับไดเรกทอรีใดที่คุณอยู่เมื่อคุณเรียกใช้เป็นไดเรกทอรีบ้านของคุณ ( ~) ใช้กับเป้าหมาย

จากนั้นฉันได้เพิ่ม~/.bash_profileรหัส 'เรียกใช้ถ้ามี' ต่อไปนี้ในไฟล์ของฉัน:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

อัปเดต: ฉันกำลังทำให้บิตของรหัสเหล่านี้รัดกุมยิ่งขึ้นเพื่อย่อขนาด.bashrcไฟล์ของฉันในกรณีนี้ฉันใช้ตอนนี้:

test -f ~/.git-completion.bash && . $_

หมายเหตุ: $_หมายถึงอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า ดังนั้น. $_หมายถึงใช้มัน - "มัน" อยู่.git-completion.bashในกรณีนี้

ยังคงใช้ได้ทั้งใน Ubuntu และ OSX และบนเครื่องที่ไม่มีสคริปต์.git-completion.bashสคริปต์

ตอนนี้git Tab(จริง ๆ แล้วgit TabTab) ทำงานเหมือนมีเสน่ห์!

ป.ล. : ถ้าสิ่งนี้ไม่สามารถใช้งานได้กับค้างคาวคุณอาจต้องวิ่งchmod u+x ~/.git-completion.bashเพื่อให้สิทธิ์ที่จำเป็น:

  • chmod เป็นคำสั่งที่แก้ไขสิทธิ์ของไฟล์
  • u หมายถึงผู้ใช้ที่เป็นเจ้าของไฟล์โดยค่าเริ่มต้นผู้สร้างคือคุณ
  • + หมายถึงการตั้งค่า / เปิดใช้งาน / เพิ่มสิทธิ์
  • x หมายถึงเรียกใช้สิทธิ์เช่นความสามารถในการเรียกใช้สคริปต์

1
ใช่เริ่มต้นใหม่เทอร์มินัลหลังจากเพิ่มสคริปต์ทุบตีทำให้มันทำงาน ผมนั่งอยู่ที่นี่สงสัยว่าทำไมมันยังคงพยายามที่จะเติมของฉันModelsโฟลเดอร์เมื่อกดที่จะทำให้มันเติมไปm Tab master
อเล็กซ์

1
ดูเพิ่มเติมที่unix.stackexchange.com/q/48862/10043สำหรับเคล็ดลับที่แตกต่าง
Michael Durrant

3
หากคำตอบที่ยอมรับไม่ได้ผลสำหรับทุกคนลองใช้วิธีนี้: source ~/.bash_profileหลังจากวางรหัสแล้ว การรีสตาร์ทเครื่องจะทำสิ่งเดียวกัน
เบ็น

ขอขอบคุณ! ฉันลองสิ่งอื่น ๆ แต่ไม่มีอะไรทำงาน (รวมถึงgithub.com/bobthecow/git-flow-completion/wiki/นี้ด้วย) วิธีการแก้ปัญหาของคุณทำงานได้อย่างมีเสน่ห์;)
rgoliveira

1
(คุณไม่มีชงgitแต่เป็นค่าเริ่มต้นของ Apple git) brew install gitและรีสตาร์ทเครื่องสำหรับผู้ที่พบข้อผิดพลาดแปลก ๆ เช่นgit checunknown option: --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>]
Sachin

89

บางคนชอบใช้ตัวจัดการแพ็คเกจเพื่อทำการติดตั้งอัพเดตและกำหนดค่าแพคเกจ Mac OS โดยอัตโนมัติ ฉันเป็นแฟนตัวจัดการแพคเกจและฉันคิดว่า Homebrew เป็นตัวจัดการแพคเกจที่ดีที่สุดสำหรับ Mac OS (บางคนก็บอกว่ามันเป็นตัวจัดการแพ็กเกจ Mac OS โดยแท้จริง)

เมื่อคุณติดตั้ง Homebrew คุณก็สามารถติดตั้งคอมไพล์พร้อมกับทุบตีเสร็จbrew install git bash-completionด้วย

จากนั้นคุณจะต้องใส่สิ่งต่อไปนี้ใน~/.bash_profile:

if [ -f `brew --prefix`/etc/bash_completion.d/git-completion.bash ]; then
  . `brew --prefix`/etc/bash_completion.d/git-completion.bash
fi

(หมายเหตุ: หากการติดตั้งนี้ล้มเหลวโดยมีข้อผิดพลาด 404 และคุณได้ติดตั้ง git แล้วให้ลบส่วน git ของการติดตั้งชงนี้)

ข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งคอมไพล์และทุบตีเสร็จสิ้นด้วยการชงที่นี่


27
การเพิ่มgitและการเพิ่มbash-completionไม่ได้เลยเช่นเดียวกับการเพิ่ม.git-completion.bash พวกเขามีโปรแกรมที่แตกต่างกันและพวกเขาทำสิ่งที่แตกต่างกันมาก - ใครไม่ autocompletion คำสั่งทุบตีและอื่น ๆ ที่ไม่เติมข้อความอัตโนมัติคำสั่งคอมไพล์และ 'แนร์ทั้งสองจะได้พบ;)
ไมเคิลแรนต์

ทำงานเหมือนมีเสน่ห์ขอบคุณมาก คุณช่วยอธิบายได้ว่าการใช้งานสคริปต์ที่คุณเพิ่มให้ฉัน~/.bash_profileคืออะไร?
Vikas Bansal

แม้จะมีสิ่งที่คนอื่นพูดเกี่ยวกับคำตอบนี้มันเป็นสิ่งที่ทำให้การเติมข้อความอัตโนมัติคอมไพล์ทำงานในเทอร์มินัล
Iain

32

รันสิ่งนี้บนเทอร์มินัล:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

จากนั้นทำสิ่งนี้:

vi ~/.bash_profile

เพิ่มบรรทัดนี้:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

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


1
(ขั้นตอนที่ 2) หากใครต้องการเปิด bash_profile ด้วยโปรแกรมแก้ไขข้อความให้ทำดังนี้: open -e .bash_profile
Nicolas Bodin-Ripert

2
บน Mac OS High Sierra บริสุทธิ์~/.bash_profileไม่มีไฟล์อยู่ ไม่เป็นไรเพียงแค่สร้างไฟล์และวางifสคริปต์ไว้ในนั้นและบันทึก รีโหลดเปลือกของคุณหลังจากนั้นและมันจะทำงาน
agm1984

11

gitและgit-completion.bashมาพร้อมกับเครื่องมือบรรทัดคำสั่ง macOS ( xcode-select --install) ~/.bash_profileต้องการเปิดใช้งานการเติมข้อความอัตโนมัติทุบตีเพิ่มนี้เพื่อคุณ

[ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ] && . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

นี่จะเปิดใช้งานการเติมข้อความอัตโนมัติให้กับสาขา git ด้วย


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

ขอบคุณ! IMO นี่ควรเป็นคำตอบด้วยเครื่องหมายถูกสีเขียว
geekisthenewcool

8

นี่คือสิ่งที่ทำให้เกิดความสับสนบางส่วนของคุณ: คุณมีเบียร์หรือพอร์ตติดตั้ง /usr/bin/แต่คุณกำลังใช้คอมไพล์ระบบใน เพื่อตรวจสอบสิ่งนี้:

which git

หากคุณเห็น/usr/bin/gitว่าการตั้งค่านั้นไม่ถูกต้องหรือคุณไม่ได้ติดตั้งคอมไพล์ผ่านทางชง

หากคุณติดตั้ง git ผ่านทาง brew การเปิดใช้งาน bash completions สำหรับ brew จะเปิดใช้งาน bash completions สำหรับ git นี่เป็นเพราะ/usr/local/etc/bash_completionแหล่งข้อมูลทุกอย่างใน/usr/local/bash_completion.dนั้นและแพ็คเกจการชงสำหรับ git จะติดตั้งสคริปต์การเติมให้เสร็จสมบูรณ์ที่นั่น


มันสมเหตุสมผลแล้ว แต่คุณจะ "เปิดใช้ bash completions for brew" ได้อย่างไร? คุณพลาดวิธีการนี้ควรเป็นส่วนหนึ่งของคำตอบของคุณ
skplunkerin

ฉันเพิ่งทำสิ่งนี้ (ใช้งานได้ดีขอบคุณ) ผ่านทางsimplified.guide/macos/bash-completionแต่การเติมอัตโนมัติจะล่าช้าไปสองสามวินาที ... คี่
skplunkerin

4

คุณสามารถติดตั้ง bash และ git จาก MacPorts โดยเปิดใช้งานตัวเลือก "bash_completion" มันอาจเป็นวิธีที่ง่ายที่สุดในการรักษาทั้งคอมไพล์และความสำเร็จที่ทันสมัย

http://denis.tumblr.com/post/71390665/adding-bash-completion-for-git-on-mac-os-x-snow-leopard

ในการติดตั้ง MacPorts: http://www.macports.org/install.php/

ข้อมูลเพิ่มเติม

สำหรับการค้นหาการตั้งค่าความสมบูรณ์บนระบบ Linux ของคุณให้ดูที่ /etc/bash_completion.d/git (เป็นไฟล์ที่มีความยาว) การคัดลอกด้วยตัวมันเองอาจจะไม่ได้ผลเนื่องจากมันถูกออกแบบมาให้ใช้งานโดยกรอบความสมบูรณ์ผ่าน / etc / bash_completion (ซึ่งมาจาก /etc/profile.d/bash_completion.sh; ไฟล์ใน / etc / profile .d มาจาก / etc / profile)


2

หากความสำเร็จของ git ของคุณเสียหายบางส่วนแม้หลังจากจัดหาhttps://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bashแล้วคุณอาจต้องอัปเดตเวอร์ชัน git ของคุณ

ตัวอย่างเช่นเมื่อฉันพิมพ์git check+ มันจะถูกต้องเติมTAB git checkoutแต่เมื่อฉันพิมพ์git checkout+ ก็ไม่ได้แสดงรายการของสาขาเท่านั้นTABHEAD

การแก้ไขสำหรับฉันคือการอัปเดตgitเวอร์ชันของฉัน ฉันอยู่ใน 2.7.0 git-completion.bashซึ่งเห็นได้ชัดว่าเข้ากันไม่ได้กับล่าสุด ฉันวิ่งbrew upgrade gitซึ่งอัปเดตเป็น 2.13.0 และตอนนี้มันเติมชื่อสาขาของฉันโดยอัตโนมัติ


ผมได้รับปัญหาเดียวกัน แต่ฉันต้องวิ่งbrew upgrade gitและbrew link git (กับการแทนที่เปิดใช้งาน)
เจดีย์

1
ขอบคุณสำหรับการจับ @Tope ฉันมีการเปลี่ยนแปลงไปupdate upgrade
wisbucky

2

โดยอ้างอิงที่ดีที่สุดที่ฉันได้พบเพื่อแก้ไขปัญหานี้อยู่ในSpinDanceโดยConnor Livingston :

หากสคริปต์git-completion.bashไม่มีอยู่ในเครื่องของคุณโปรดเรียกคืนจากลิงก์ที่ฉันให้ไว้ข้างต้น (ซึ่งคือสิ่งนี้ ) และบันทึกลงในเครื่องท้องถิ่นของคุณในไฟล์ใหม่ที่เรียกว่าgit-completion.bashใน/ไดเร็กทอรีusr / local / etc / bash_completion.d / หากสคริปต์git-completion.bashมีอยู่ในเครื่องของคุณ แต่ไม่ได้อยู่ในไดเรกทอรี/usr/local/etc/bash_completion.d/เราควรสร้างสำเนาของมันในไดเรกทอรีนั้น sudo cpอย่างรวดเร็ว/current/path/to/your/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bashควรทำเคล็ดลับ สำหรับผู้ที่อยากรู้เกี่ยวกับ / usr/local/etc/bash_completion.d/ ไดเรกทอรี: มันสำหรับการจัดเก็บคำสั่งเสร็จใหม่และคุณอาจต้องสร้างมันถ้ามันไม่ได้อยู่ในเครื่องของคุณ

ณ จุดนี้สคริปต์ git-completion.bash ควรมีอยู่ในเครื่องของคุณในไดเรกทอรี/usr/local/etc/bash_completion.d/ ตอนนี้เราจะเสียบสคริปต์คอมไพล์เสร็จสิ้นลงในทุบตีโดยชี้ไปที่ได้จาก~ / .bash_profile

หมายเหตุ: เครื่องหมายตัวหนอนในประโยคก่อนหน้าอ้างถึงโฮมไดเร็กตอรี่ในคอมพิวเตอร์ของคุณ เพิ่มบรรทัดต่อไปนี้ใน~ / .bash_profile : source /usr/local/etc/bash_completion.d/git-completion.bashและบันทึก ขั้นตอนสุดท้ายคือการโหลดโปรไฟล์ทุบตีของคุณใหม่ คุณสามารถบรรลุสิ่งนี้ได้โดยการรันซอร์ส ~ / .bash_profileในเซสชัน bash ปัจจุบันของคุณ


1

ลองใช้และใช้งานได้ดีกับสาขา แต่เมื่อคุณทำgit st+ tabก็แสดงข้อผิดพลาดเช่นนี้

ตัวเลือกที่ไม่รู้จัก: - list-cmds = list-mainporcelain, อื่น ๆ , ตัวช่วยอื่น, alias, list-complete, การใช้ config: git [--version] [--help] [--C] [-c =] [--exec -path [=]] [--html-path] [--man-path] [--info-path] [-p | - เผยแพร่หน้า | - ไม่มีเพจเจอร์] [- ไม่มี - แทนที่วัตถุ] [--bare] [--git-dir =] [--work-tree =] [--namespace =] []

ค้นหาอินเทอร์เน็ตและพบว่า--list-cmdsใน.git-completion.bashเป็นรุ่นล่าสุดของ git และใน mac ของฉันเป็นรุ่น git2.17.2

นี่คือโซลูชั่น

โซลูชันที่ 1

  1. ตรวจสอบเวอร์ชันของ git โดยใช้git --versionคำสั่ง
  2. จากนั้นใส่หมายเลขเวอร์ชันเดียวกันลงใน URL ตามที่ฉันทำ

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
  3. จากนั้นทำตามขั้นตอนเดียวกับคำตอบด้านบนให้ใส่โค้ดด้านล่าง ~/.bash_profile

    if [ -f ~/.git-completion.bash ]; then
      . ~/.git-completion.bash
    fi

โซลูชันที่ 2

คุณควรพยายามอัปเดตเวอร์ชัน git เป็นรุ่นล่าสุดจากนั้นจึงควรใช้งานได้


0

ติดตั้งoh-my-zshและตั้งค่า zsh เป็นเชลล์เริ่มต้นของคุณและขอบคุณในภายหลัง :)


ฉันได้ทำอย่างนั้นด้วยความหวังว่าจะไม่ต้องจัดการกับมัน - ยังไม่มีคำแนะนำสาขาหลังจากกดปุ่มแท็บ
Jytug

จริงๆแล้วคุณไม่จำเป็นต้องใช้ oh-my-zshหรือแม้แต่ระบบปลั๊กอินแยกต่างหากเลย! เสร็จสิ้น Git มาจากกล่องคุณเพียงแค่ต้องเปิดใช้งาน
SilverWolf

0

ผู้ใช้ส่วนใหญ่จะได้gitรับการติดตั้งเป็นส่วนหนึ่งของเครื่องมือบรรทัดคำสั่งที่ Xcode และกฎระเบียบเสร็จทุบตีสำหรับคอมไพล์จะสามารถใช้ได้ที่/usr/bin/git/Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

ในกรณีนี้ไม่จำเป็นต้องติดตั้ง git จาก Homebrew หรือกฎการเติม git ที่มาจาก raw.githubusercontent.com เพียงสร้าง symlink ดังนี้

cd /usr/local/etc/bash_completion.d/
ln -s /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash git

หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งและกำหนดค่าbash-completionแพ็คเกจจาก Homebrew


-2

ค้นหา.bashrcไฟล์ของคุณ

เปิดและเพิ่มบรรทัดนี้ที่ด้านล่าง:

source /etc/bash_completion.d/git


1
ฉันไม่มี/etc/bash_completion.d/โฟลเดอร์ในระบบที่ค่อนข้างใหม่ (OSX 10.10.3)
livingtech

ลองสร้างมัน
crmpicco

ไม่ใช่ bash_completion, git_completion ซึ่งทำสิ่งที่แตกต่าง
Michael Durrant

@MichaelDurrant มันใช้งานได้ เชื่อฉัน. ;) prowrestlingtees.com/media/catalog/product/cache/1/image/
......

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