git tự động hoàn thành cho * chi nhánh * tại dòng lệnh?


350

Trên máy Linux của tôi, tôi đã tự động hoàn tất các nhánh với Git.

[Lưu ý chúng tôi đang nói về việc hoàn thành nhánh git, không phải hoàn thành bash (ví dụ: các lệnh, tệp, v.v.). Do đó, KHÔNG phải câu trả lời của Lane ]

Ví dụ tôi có thể gõ git checkout+ TABvà lấy danh sách các nhánh.

Hoặc tôi có thể gõ git checkout feb*+ TABđể có được tất cả các nhánh bắt đầu bằng "feb".

Làm cách nào tôi có thể có được chức năng này trên máy Mac?

Tôi đã thử tải xuống và chạy bash-completion/bash_completionbash-completion/bash_completion.sh.inkhông có niềm vui. Việc đầu tiên đưa ra thông báo lỗi về declare: -A invalid_option. Thứ hai không có lỗi. Khi tôi git checkout+ TABmặc dù tôi vẫn nhận được một danh sách các tệp trong thư mục, không phải các nhánh. Tôi đang ở trong dự án gốc.

Tự động hoàn tất cho các thư mục và các lệnh bash đang hoạt động tốt, vì vậy nó đặc trưng cho Git.

Câu trả lời:


483

ok, vì vậy tôi cần kịch bản tự động hoàn thành git .

Tôi đã nhận được điều đó từ url này:

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

Không cần phải lo lắng về thư mục bạn đang sử dụng khi bạn chạy thư mục này vì thư mục chính của bạn ( ~) được sử dụng với mục tiêu.

Sau đó, tôi đã thêm vào ~/.bash_profiletệp của mình mã 'thực thi nếu nó tồn tại' sau đây:

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

Cập nhật: Tôi đang làm cho các bit mã này ngắn gọn hơn để thu nhỏ .bashrctệp của mình , trong trường hợp này tôi hiện đang sử dụng:

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

Lưu ý: $_có nghĩa là đối số cuối cùng cho lệnh trước đó. vì vậy . $_có nghĩa là chạy nó - "nó" .git-completion.bashtrong trường hợp này

Điều này vẫn hoạt động trên cả Ubuntu và OSX và trên các máy không có tập .git-completion.bashlệnh script.

Bây giờ git Tab(thực ra nó git TabTab) hoạt động như một bùa mê!

ps: Nếu điều này không hiệu quả với dơi, bạn có thể cần phải chạy chmod u+x ~/.git-completion.bashđể cấp cho mình quyền cho phép cần thiết:

  • chmod là lệnh sửa đổi quyền của tập tin
  • u có nghĩa là người dùng sở hữu tệp, theo mặc định người tạo tệp, tức là bạn
  • + có nghĩa là đặt / kích hoạt / thêm quyền
  • x có nghĩa là thực thi quyền, tức là khả năng chạy tập lệnh

1
Đúng, khởi động lại thiết bị đầu cuối sau khi thêm tập lệnh bash làm cho nó hoạt động. Tôi đang ngồi đây tự hỏi tại sao nó cứ cố tự động hoàn thành vào Modelsthư mục của tôi khi tôi nhấn m Tabđể làm cho nó tự động hoàn thành master.
Alex

1
Xem thêm unix.stackexchange.com/q/48862/10043 để biết một mẹo khác
Michael Durrant

3
Nếu câu trả lời được chấp nhận không hiệu quả với bất cứ ai thì hãy thử điều này: source ~/.bash_profilesau khi dán mã. Khởi động lại thiết bị đầu cuối cũng sẽ làm điều tương tự.
Ben

Cảm ơn bạn! Tôi đã thử một số thứ khác nhưng không có gì hoạt động (bao gồm cả github.com/bobthecow/git-flow-completion/wiki/iêu ). Giải pháp của bạn hoạt động như một cơ duyên;)
rgoliveira 19/07/17

1
(bạn không có bia gitnhưng mặc định của Apple git) brew install gitvà khởi động lại thiết bị đầu cuối cho những người đang gặp phải lỗi lạ như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

Một số người thích sử dụng trình quản lý gói để tự động cài đặt, cập nhật và định cấu hình các gói Mac OS. Tôi là một fan hâm mộ của các trình quản lý gói và tôi nghĩ Homebrew là trình quản lý gói tốt nhất cho Mac OS (một số người sẽ nói đó là trình quản lý gói Mac OS thực tế).

Khi bạn đã cài đặt Homebrew, bạn chỉ cần cài đặt git cùng với hoàn thành bash với brew install git bash-completion.

Sau đó, bạn sẽ cần phải đặt những điều sau đây vào ~/.bash_profile:

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

(Lưu ý: Nếu cài đặt này không thành công với lỗi 404 và bạn đã cài đặt git, chỉ cần xóa phần git của cài đặt brew này)

Thông tin thêm về cài đặt git và bash-hoàn thành với brew ở đây.


27
Thêm gitvà thêm hoàn toàn bash-completionkhông giống như thêm .git-completion.bash Chúng là các chương trình khác nhau và chúng làm những việc hoàn toàn khác nhau - một là bash lệnh tự động hoàn thành và cái kia thực hiện lệnh tự động hoàn thành và 'nair the twain sẽ gặp nhau;)
Michael Durrant

Làm việc như một cơ duyên, cảm ơn nhiều. Bạn có thể vui lòng giải thích việc sử dụng tập lệnh mà bạn đã thêm tôi vào là ~/.bash_profilegì không?
Vikas Bansal

Bất chấp những gì người khác đã nói về câu trả lời này, nó là người đã khiến git tự động hoàn thành hoạt động trong thiết bị đầu cuối.
Iain

32

Chạy cái này trên terminal:

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

Sau đó, làm điều này:

vi ~/.bash_profile

Thêm dòng này:

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

Đó là tất cả. Điều này làm việc cho tôi.


1
(Bước 2) Nếu bất kỳ ai thích mở bash_profile bằng trình soạn thảo văn bản, chỉ cần làm điều này: open -e .bash_profile
Nicolas Bodin-Ripert

2
Trên Mac OS High Sierra, ~/.bash_profiletệp không tồn tại. Điều đó tốt thôi, chỉ cần tạo tập tin và đặt iftập lệnh vào đó và lưu lại. Tải lại vỏ của bạn sau và nó sẽ hoạt động.
agm1984

11

gitgit-completion.bashđã đi kèm với các công cụ dòng lệnh macOS ( xcode-select --install). Để bật bash autocomplete, hãy thêm cái này vào ~/.bash_profile.

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

Điều này cũng sẽ kích hoạt tự động hoàn thành cho các nhánh git.


Khá chắc chắn rằng tôi đã cài đặt các công cụ dòng lệnh, nhưng tệp đó không tồn tại trong trường hợp của tôi. Hạnh phúc khi đi với bia mặc dù (và vì git của tôi cũng với bia, có lẽ cũng khôn ngoan hơn).
drevicko

Cảm ơn! IMO, đây sẽ là câu trả lời với dấu kiểm màu xanh lá cây.
geekisthenewcool

8

Đây là điều khiến một số bạn bối rối: bạn đã cài đặt brew hoặc port, nhưng bạn đang sử dụng hệ thống /usr/bin/. Để kiểm tra điều này:

which git

Nếu bạn thấy /usr/bin/gitthì brew không được cấu hình đúng hoặc bạn chưa cài đặt git qua brew.

Nếu bạn cài đặt git qua brew, thì việc bật hoàn thành bash cho brew cũng sẽ cho phép hoàn thành bash cho git. Điều này là do /usr/local/etc/bash_completionthực sự nguồn mọi thứ trong /usr/local/bash_completion.dvà gói brew cho git cài đặt một kịch bản hoàn thành git ở đó.


Điều này có ý nghĩa, nhưng làm thế nào bạn "kích hoạt hoàn thành bash cho brew"? Bạn đang thiếu cách làm điều đó, đây sẽ là một phần trong câu trả lời của bạn
skplunkerin

Tôi chỉ làm điều này (nó hoạt động, cảm ơn bạn) thông qua simplified.guide/macos/bash-completion , nhưng hoàn thành tự động là một vài giây trì hoãn ... lẻ
skplunkerin

4

Bạn có thể cài đặt bash và git từ MacPorts với tùy chọn "bash_completion" được bật. Đây có lẽ là cách dễ nhất để duy trì cả git và hoàn thành cập nhật.

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

Để cài đặt MacPorts: http://www.macports.org/install.php/

thông tin bổ sung

Đối với việc định vị các cài đặt hoàn thành trên hệ thống Linux của bạn, hãy xem /etc/bash_completion.d/git (đây là một tệp dài). Tuy nhiên, việc sao chép nó có thể sẽ không hoạt động, vì nó được thiết kế để có nguồn gốc từ khung hoàn thành thông qua / etc / bash_completion (được lấy từ /etc/profile.d/bash_completion.sh; các tệp trong / etc / profile .d có nguồn gốc từ / etc / profile).


2

Nếu hoàn thành git của bạn bị hỏng một phần, ngay cả sau khi tìm nguồn cung ứng https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash, bạn có thể chỉ cần cập nhật phiên bản git của mình.

Ví dụ, khi tôi gõ git check+ TAB, nó sẽ tự động hoàn thành chính xác git checkout. Nhưng khi tôi gõ git checkout+ TAB, nó không hiển thị danh sách các nhánh HEAD.

Cách khắc phục cho tôi là cập nhật gitphiên bản của tôi . Tôi đã vào ngày 2.7.0, dường như không tương thích với phiên bản mới nhất git-completion.bash. Tôi đã chạy brew upgrade git, đã cập nhật nó lên 2.13.0, và bây giờ nó tự động hoàn thành đúng tên chi nhánh của tôi.


Tôi đã gặp vấn đề tương tự, nhưng tôi phải chạy brew upgrade gitbrew link git (bật tính năng ghi đè)
Tope

1
Cảm ơn đã bắt @Tope. Tôi đã đổi updatethành upgrade.
wvducky

2

Cho đến nay, tài liệu tham khảo tốt nhất mà tôi tìm thấy để giải quyết vấn đề này là trên SpinDance , bởi Connor Livingston :

Nếu git-completion.bash kịch bản không tồn tại trên máy tính của bạn, xin vui lòng lấy nó từ liên kết tôi cung cấp ở trên (mà là này ) và lưu nó vào máy tính cục bộ của bạn trong một tập tin mới gọi là git-completion.bash trong / thư mục usr / local / etc / bash_completion.d / . Nếu tập lệnh git- xong.bash tồn tại trên máy của bạn, nhưng không có trong thư mục /usr/local/etc/bash_completion.d/ , chúng ta nên tạo một bản sao của nó trong thư mục đó. Một sudo cp / cản / path / to / your / git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash nên thực hiện thủ thuật này. Đối với những người tò mò về /usr/local/etc/bash_completion.d/ thư mục: để lưu trữ các lệnh hoàn thành mới và bạn có thể phải tạo nó nếu nó không tồn tại trên máy của bạn.

Tại thời điểm này, tập lệnh git-xong.bash sẽ tồn tại trên máy cục bộ của bạn trong thư mục /usr/local/etc/bash_completion.d/ . Bây giờ chúng ta sẽ cắm tập lệnh hoàn thành git vào bash bằng cách trỏ đến nó từ ~ / .bash_profile .

Lưu ý: dấu ngã trong câu trước đề cập đến thư mục chính trên máy tính của bạn. Thêm dòng sau vào ~ / .bash_profile : source /usr/local/etc/bash_completion.d/git-completion.bash và lưu. Bước cuối cùng là tải lại hồ sơ bash của bạn. Bạn có thể đạt được điều này bằng cách chạy nguồn ~ / .bash_profile trong phiên bash hiện tại của bạn.


1

Đã thử nó và nó hoạt động tốt cho các chi nhánh nhưng khi bạn làm git st+ tabthì nó hiển thị lỗi như thế này

tùy chọn không xác định: --list-cmds = list-mainpor chì, những người khác, nohelpers, bí danh, hoàn thành danh sách, sử dụng cấu hình: git [--version] [--help] [-C] [-c =] [--exec -path [=]] [--html-path] [--man-path] [--info-path] [-p | - kết thúc | --no-pager] [--no-thay-object] [--bare] [--git-dir =] [--work-tree =] [--namespace =] []

Tìm kiếm trên internet và thấy rằng --list-cmdstrong .git-completion.bashphiên bản mới nhất của git và trên mac của tôi, phiên bản git là2.17.2

Dưới đây là các giải pháp

Giải pháp 1

  1. Kiểm tra phiên bản của git bằng cách sử dụng git --versionlệnh
  2. Sau đó đặt cùng số phiên bản vào url như tôi đã làm

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
  3. Sau đó làm theo các bước tương tự như trong câu trả lời trên cùng, đặt mã dưới đây vào ~/.bash_profile

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

Giải pháp 2

Bạn nên cố gắng cập nhật phiên bản git mới nhất để nó hoạt động.


0

Cài đặt oh-my-zsh và đặt zsh làm vỏ mặc định của bạn và cảm ơn tôi sau :)


Tôi đã làm điều đó, chính xác với hy vọng không phải đối phó với nó - vẫn không có đề xuất chi nhánh nào sau khi nhấn tab
Jytug

Bạn thực sự không cần oh-my-zsh , hoặc thậm chí bất kỳ hệ thống plugin riêng biệt nào cả! Hoàn thành Git ra khỏi hộp, bạn chỉ cần kích hoạt nó.
SilverWolf

0

Hầu hết người dùng sẽ gitcài đặt như một phần của công cụ dòng lệnh xcode tại /usr/bin/gitvà quy tắc hoàn thành bash cho git sẽ có sẵn tại /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash.

Trong trường hợp này, không cần cài đặt git từ Homebrew hoặc quy tắc hoàn thành git nguồn từ raw.githubusercontent.com. Chỉ cần tạo một liên kết tượng trưng như sau:

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

Lưu ý: đảm bảo bạn đã cài đặt và cấu hình bash-completiongói từ Homebrew.


-2

Xác định vị trí .bashrctệp của bạn .

Mở nó và thêm dòng này ở dưới cùng:

source /etc/bash_completion.d/git


1
Tôi không có bất cứ thứ gì một /etc/bash_completion.d/thư mục, trên một hệ thống tương đối mới (OSX 10.10.3).
LivingTech

Hãy thử tạo nó.
crmpicco

Không phải bash_completion, git_completion mà làm những thứ khác nhau.
Michael Durrant

@MichaelDurrant Nó hoạt động. Tin tôi đi ;) Prowrestlingtees.com/media/catalog/product/cache/1/image/...
crmpicco

@crmpicco Bạn có thể vui lòng cung cấp hướng dẫn để tạo /etc/bash_completion.d/gitkhông? Nó sẽ làm cho câu trả lời của bạn có giá trị hơn.
Dannid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.