2009-08-20 7 views
63

Tôi có thể nhúng mã bash shell sau:Làm thế nào để nhúng script bash trực tiếp bên trong một bí danh git

for name in $(git diff --name-only $1); do git difftool $1 $name & done 

trực tiếp vào việc tạo ra một bí danh git:

git config --global alias.diffall ***my-bash-code-here*** 

Điều này dẫn trên từ của tôi previous question/answer trên SO, nơi tôi đặt mã vào tệp .sh và sau đó được đặt bí danh vào tệp:

git config --global alias.diffall '!sh diffall.sh' 

Nhưng trong nev er-ending quest cho đơn giản, có gotta là một cách để bỏ qua các tập tin và chèn mã trực tiếp vào bí danh? Tôi không thể tìm ra định dạng ...

Trả lời

70
git config --global alias.diffall '!sh diffall.sh' 

này là không cần thiết bằng cách này. Nếu bạn định thêm 'diffall.sh' vào $ PATH của mình, tại sao bạn không lưu nó thành 'git-diffall', và tiết kiệm cho mình khỏi việc khai báo một bí danh. Có, "git diffall" sẽ chạy nó.

+0

Điều đó. Tuyệt. Ban đầu tôi lo lắng rằng tôi sẽ vô tình chạy một thứ gì đó, vì tôi đã viết một vài kịch bản lệnh shell để làm công cụ git, và cho họ tiền tố 'git-', Nhưng vỏ của tôi (zsh) không tự động hoàn thành chúng, vì vậy tôi phải nhập chúng một cách rõ ràng. Và nếu tôi muốn có hành vi tự động hoàn thành, tôi có thể khai báo một bí danh git cho tiểu ban của riêng nó, đó cũng là một yêu cầu mà tôi làm cho liên kết từ tập lệnh thành tiểu mục và rõ ràng. –

+0

Yup, và đó là một nhị phân bạn chỉ cần các bang: '! binary' –

13

Thêm 2 dòng này vào tệp .git/config của bạn nên thực hiện thủ thuật.

[alias] 
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done' 

Chỉnh sửa: có lẽ phiên bản git-config cũng hoạt động nhưng tôi muốn giữ bí danh trong tệp cấu hình để dễ quản lý.

Có một trang đẹp trên wiki git giải thích bí danh rất rõ ràng: http://git.or.cz/gitwiki/Aliases Đặc biệt, hãy đọc 'bí danh tiên tiến với các đối số'

+0

cấu hình git --global sẽ lưu trữ bí danh của bạn trên $ HOME/.gitconfig, trong đó (IMO) chúng thậm chí còn dễ quản lý hơn; hầu như không có bí danh nào cần phải là kho lưu trữ cụ thể. (Repo cụ thể đi vào repo/.git/config) – u0b34a0f6ae

+0

Cảm ơn David, nhưng nó sẽ không làm việc cho tôi - đó hoặc bất kỳ biến thể nào trong liên kết tuyệt vời mà bạn đưa vào. Có lẽ tôi nên nói rằng tôi đang chạy trong môi trường Windows? Cảm ơn Kaizer, đã đồng ý, đây là 'toàn cầu' đối với tôi. –

+0

Những ngày này, https://git.wiki.kernel.org/index.php/Aliases#Advanced là một nơi tốt để xem. (liên kết git hoặc cz chuyển hướng ở đó, nhưng phần này đặc biệt đề cập đến việc chạy những thứ phức tạp với các đối số) – clacke

20

Tôi không thể tìm thấy trong tài liệu, nhưng nếu bạn tạo một tập lệnh "git- < name>" trong đường dẫn, bạn có thể gọi nó bằng "git name" trong repo của bạn.

Xem:

$ cd ~/bin 
$ echo "echo I love this log: 
>pwd 
>git log --graph --summary --decorate --all" > git-logg 
$ chmod +x git-logg 
$ cd /path/to/your/repo 
$ git logg 
I love this log: 
/path/to/your/repo 
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch) 
| Author: myself <[email protected](none)> 
| Date: Fri Apr 1 16:47:20 2011 +0200 
| 
|  would have been better not to do it at all 
| 
... 
$ 

Vì vậy, bạn có thể viết bất kỳ bí danh bạn thích với điều này (chứ không phải mơ hồ) cách quá.

Thậm chí bạn còn có thể thêm tự động hoàn thành vào lệnh mới xác định hàm. Thông tin here

$ _git_logg() 
{ 
    # you can return anything here for the autocompletion for example all the branches 
    __gitcomp_nl "$(__git_refs)" 
} 
+0

+1, nghĩ rằng nó sẽ chỉ hoạt động từ thư mục git libexec. cảm ơn vì đã chia sẻ mẹo này –

-3

(Từ ProGit tài liệu: http://progit.org/book/ch7-3.html)

Bạn đã cố gắng thêm một kịch bản trong .git/móc?

Ví dụ: nếu bạn tạo tập lệnh.git/móc/sau thanh toán:

#!/bin/bash 

echo "This is run after a 'git checkout'" 

và sau đó chạy lệnh:

$ git checkout master 
Switched to branch 'master' 
This is run after a 'git checkout' 
+3

móc phải làm gì với cấu hình, tiện ích mở rộng và bí danh? –

20

Để chạy lệnh bên trong một bí danh git, và đặc biệt để vượt qua đối số cho các lệnh, bạn sẽ có khả năng phải tạo một hàm tạm thời mà bạn ngay lập tức gọi ra:

$ vim ~/.gitconfig 
... 
[alias] 
    # compare: 
    foo = "! echo begin arg=$1/$2/end" 
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f" 

Trong ví dụ này, hàm có thể là những gì bạn cần (và linh hoạt hơn về những gì bạn có thể làm trong một "chỉ số" ement "); và bạn có thể có thể nói rằng đối với cả hai tùy chọn, các arg còn lại cho lệnh git chỉ đơn giản là được chuyển như args cho bí danh, bất kể là "echo" hay "f"; cách gọi các chức năng đơn giản là tiêu thụ các args, bỏ qua những gì không được sử dụng một cách rõ ràng:

$ git foo a b c 
begin arg=a/b/end a b c 

$ git foo2 a b c 
begin arg=a/b/end 

Một ví dụ khác (liệt kê tất cả các bí danh, dựa trên phù hợp với mô hình) (lưu ý: bạn có thể giữ tái sử dụng tên hàm tương tự "f()" trong suốt các .gitconfig):

[alias] 
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f" 

lợi nhuận đầu tiên bí danh cho chỉ là "foo $", thứ hai cho "foo *.":

$ git alias foo 
alias.foo ! echo begin arg=$1/$2/end 

$ git alias 'foo.*' 
alias.foo ! echo begin arg=$1/$2/end 
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f 

(nb: Kết quả thực tế có thể khác nhau dựa trên vỏ ; Tôi đang sử dụng điều này với bash trên Linux, Unix & Cygwin (Windows).)

+0

https://git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F ngầm khuyên bạn nên sử dụng 'sh -c', theo cách đó bạn không phải lo lắng về vỏ đăng nhập của người dùng. – clacke

+0

Cú pháp hàm tôi đã cung cấp là cố tình di chuyển trên một vài shell (sh/ksh/bash/zsh), và sẽ nhanh hơn việc khởi chạy một tiến trình con. Tôi khuyên bạn nên vẫn sử dụng cú pháp hàm, trừ khi có vấn đề về tính di động cụ thể trên một nền tảng cụ thể. – michael

+0

Nhận xét của bạn đưa tôi trở lại câu trả lời này và tôi có thể sẽ sử dụng theo cách của bạn. Nó giúp tiết kiệm một mức báo giá, và những cấp độ đó đủ điên rồ như vậy. :-) – clacke