Git tự động hoàn thành trong bí danh bash?


83

Tôi đang sử dụng golàm bí danh bash đơn giản cho git checkout branchname. Điều mà tôi bỏ lỡ là tính năng tự động hoàn thành hoạt động với git checkout branchna...lệnh đầy đủ , nhưng không phải trong bí danh.

Có cách nào để hướng dẫn Bash "kế thừa" "trình điều khiển" tự động điền cho một lệnh khác không?




Liên quan: nếu bí danh đặt một tùy chỉnh git-dirthì hãy sử dụng cái này .
user202729,

Câu trả lời:


46

Nếu bạn có thể tìm ra hàm hoàn thành được sử dụng bởi lệnh gốc, bạn có thể gán nó cho bí danh bằng cách sử dụng complete -F.

Ví dụ, trên hộp ubuntu của tôi, hàm hoàn thành được sử dụng bởi git checkout_git_checkout(tìm thấy trong /etc/bash_complete.d/git).

Thí dụ

Trước khi chạy complete -F:

[me@home]$ git checkout <TAB><TAB>
HEAD            master          origin/HEAD     origin/master

[me@home]$ alias go="git checkout"

[me@home]$$ go <TAB><TAB>
.git/                precommit_config.py  README.md            SvnSentinel/         
.gitignore           precommit.py         startcommit.py       tests/ 

Sau:

[me@home]$$ complete -F _git_checkout go

[me@home]$$ go <TAB><TAB>
HEAD            master          origin/HEAD     origin/master 

1
trên ubuntu 12.04, các bản hoàn chỉnh dường như nằm trong: /etc/bash_completion.d/git chứ không phải /etc/bash_complete.d/git
Maks 22/1013

8
Nếu complete -Fkhông làm việc cho bạn, hãy xem câu trả lời về __git_completedưới stackoverflow.com/a/24665529/3779
Steve Clay

98

Sau khi sử dụng complete -F:

complete -F _git_checkout go

Đánh dấu sau go có thể dẫn đến:

bash: [: 1: unary operator expected

Thay vì complete, hãy sử dụng__git_complete

Đây là chức năng tích hợp sẵn của git bash Complete cho mục đích này.

Sau khi khai báo bí danh của bạn, hãy liên kết chức năng tự động hoàn thành chính xác với nó:

alias g="git"
__git_complete g _git

alias go="git checkout"
__git_complete go _git_checkout

alias gp="git push"
__git_complete gp _git_push

3
@ LưuVĩnhPhúc Tôi cũng gặp vấn đề tương tự. Đó là vì tôi có __git_completehàm trong gói bash-hoàn thành của mình (được cài đặt qua homebrew với brew install bash-completion), hiện không có nguồn trong hồ sơ bash của tôi. Đã phải thêm dòng này vào ~ / .bash_profile:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
jangosteve Ngày

Thêm __git_complete dưới git checkoutbí danh hoạt động như một sự quyến rũ !!!
Rajaraman

Nó nên được __git_main, không phải _git. Lý do _gittồn tại là chỉ cho khả năng tương thích ngược, về cơ bản nó __git_mainđược bao bọc.
FelipeC

18

Trong Ubuntu 16.04.3 LTS, tệp tôi cần để tạo nguồn /usr/share/bash-completion/completions/git. Vì vậy, trong .bash_custom(hoặc .bashrc, bất cứ điều gì):

[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main

1
Lý do yêu cầu tải thủ công là hiện tại Bash tải động các tệp đó. Cho đến nay nó tải chúng theo tên của chúng. Tệp sẽ không được tải cho đến khi bạn hoàn thành Git, quá muộn so với thời gian .bashrcđược đọc.
Franklin Yu

17

Trên Ubuntu 18.04 (Bionic), các cách sau hoạt động. Thêm một cái gì đó giống như đoạn này (với bí danh của bạn) để ưu tiên cấu hình bash tập tin ví dụ của bạn .bashrc, .bash_aliases .bash_profile.

# define aliases
alias gc='git checkout'
alias gp='git pull'

# setup autocompletion
if [ -f "/usr/share/bash-completion/completions/git" ]; then
  source /usr/share/bash-completion/completions/git
  __git_complete gc _git_checkout
  __git_complete gp _git_pull
else
  echo "Error loading git completions"
fi

Nói chung, định dạng của __git_completechỉ thị như sau:

__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>

Điều này kết hợp sự khôn ngoan từ các câu trả lời hiện có trong một câu trả lời cập nhật duy nhất, cảm ơn tất cả các bạn.


Tôi chỉ muốn thêm điều đó cho một phiên chỉ ssh / terminal, đặt mọi thứ vào .bashrc. Tôi đã có toàn bộ nội dung git trong .bash_profile và các bí danh trong .bashrc nhưng không thể làm cho nó hoạt động. Mãi cho đến khi tôi thêm dấu echo "profile"/ echo "rc"thì tôi mới hiểu ra được điều đó.
mtonc

2

Để thêm vào các câu trả lời xuất sắc khác: thông thường bạn có rất nhiều bí danh Git và việc chuyển tiếp hoàn thành thủ công cho tất cả chúng có thể rất tẻ nhạt. Đây là một thủ thuật nhỏ để thực hiện việc này tự động:

if [ -f "/usr/share/bash-completion/completions/git" ]; then
  # Enable Git completions for aliases
  . /usr/share/bash-completion/completions/git
  for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do
    c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_')
    if set | grep -q "^_git_$c *()"; then
      eval "__git_complete $a _git_$c"
    fi
  done
fi


1

Đối với macOS, chạy phần sau để cài đặt hoàn thành bash

 brew install bash-completion

Sau đó, thêm phần sau

[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" 

tới .bashrc hoặc .bash_profile của bạn


1

Trên Ubuntu 20.04, tôi thêm cái này vào ~/.bashrc

source /usr/share/bash-completion/completions/git
alias g='git'
__git_complete g _git
alias go='git checkout'
__git_complete go _git_checkout

1

Như người khác đã trả lời, bạn nên sử dụng __git_complete, nếu không tập lệnh sẽ bị lỗi.

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

Nhưng bạn không nên sử dụng _gitcho lệnh chính, nó __git_main.

Rất tiếc, nhiều thông tin về quá trình hoàn thành bị ẩn, nhưng bạn có thể tìm thêm trên README of my fork: git-complete .


0

Tôi nhận ra rằng bạn đang hỏi cụ thể về bí danh bash, nhưng đối với những người đến đây tìm kiếm tính năng tự động hoàn thành trong bash cho bí danh git phức tạp, hãy xem tại đây .

Đặc biệt:

# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style.  For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion.  This also works with aliases
# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
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.