Bí danh Git - Nhiều lệnh và tham số


182

Tôi đang cố gắng tạo một bí danh sử dụng cả hai lệnh Git và tham số vị trí. Có mỗi trang Stackoverflow cho mỗi trang, và nó có vẻ rất rõ ràng để làm cả hai, nhưng tôi gặp rắc rối.

Ví dụ, tôi muốn chuyển sang nhánh foo và thực hiện trạng thái. Vì vậy, trong tôi .gitconfig, tôi có:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

mà không làm việc Trong khi một cái gì đó như thế này sẽ làm việc.

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

Bất kỳ cái nhìn sâu sắc sẽ được đánh giá cao.


Bí danh của tôi: git config --global alias.go '! Git commit -a && git pull --rebase && git đẩy && git status'. Lưu ý: Sử dụng dấu ngoặc đơn giản.
Marcus Becker

Câu trả lời:


157

Điều này sẽ hoạt động (được thử nghiệm với zsh và bash):

[alias] chs = !git checkout $1 && git status

1
Không, nó sẽ không. Git sẽ biến git chs foothànhgit checkout && git status foo
Lily Ballard

24
Thật thú vị, git thực sự không điền vào các biến vị trí trong các bí danh shell. Nhưng nó vẫn bị phá vỡ, bởi vì nó cũng giải quyết chúng như là những cuộc tranh luận. Một bí danh echo $1 && echo done, khi được gọi với đối số 'foo', sẽ xuất ra cả "foo" và "xong foo".
Lily Ballard

7
Dấu chấm than trước cho lần gọi đầu tiên là gitgì?
Elijah Lynn

21
@ElijahLynn: Trong một bí danh git, một !phương tiện hàng đầu truyền toàn bộ vào vỏ. Mặt khác, nó giả định rằng bạn đang cố chạy một lệnh git khác và chuyển nó dưới dạng đối số cho gitnhị phân.
Lily Ballard

2
@Brondahl Thông minh. Tôi muốn giới thiệu ;:thay vì && :mặc dù. Và nó cũng hoạt động tốt trên unix.
Lily Ballard

82

Điều này nhắm mục tiêu Windows lô / msysgit bash; có thể không hoạt động trên các môi trường khác.

Như Olivier Verdier và Lily Ballard đã nói

[alias] chs = !git checkout $1 && git status

gần như hoạt động, nhưng cung cấp thêm phần bổ sung giả mạo của đối số ...

git chs demo -> git checkout demo && git status demo

Nhưng nếu bạn thêm && :vào cuối bí danh của mình, thì đối số giả sẽ được sử dụng vào thẻ vị trí.

Vì thế

[alias] chs = !git checkout $1 && git status && :

cho đầu ra chính xác ... git chs demo -> git checkout demo && git status


9
Đây && :là vàng và làm cho giải pháp này hoạt động đối với các lệnh trong đó đối số phụ sẽ có vấn đề.
Đất sét

3
@Clay (hoặc bất cứ ai khác) - Ai đó có thể giải thích cho BASH bị thách thức && :không?
Justin Morgan

7
@JustinMorgan && có nghĩa là nếu lệnh trước biến thành 0 (thành công), sau đó chạy lệnh sau &&. ':', dấu hai chấm, là một lệnh dựng sẵn shell, không có gì ngoài việc mở rộng đối số và thực hiện chuyển hướng và trả về trạng thái 0. Dưới đây là một số cách sử dụng: 1. a=123;$alỗi, nhưng a=123; : $akhông. 2. làm : > hello.txttrống hello.txt. 3. if [ "$a" = "hello" ];then : ;fichạy ổn nhưng lỗi không có ':'. Nó giống như passtrong trăn. 4. : this is a comment, dấu hai chấm theo không gian hoạt động như #trong một dòng bình luận.
ElpieKay

2
Đây là một hack ... git nên chấp nhận nhiều chế độ lệnh
kchoi

1
Cảm ơn @ElpieKay đã giải thích. Bí danh git địa phương của tôi cho một proejct là co = !git checkout public/compiled && git checkout $1và khi tôi git co masternhận được tin nhắn error: pathspec 'master' did not match any file(s) known to git.. Tôi không nghĩ câu trả lời này sẽ hữu ích cho tôi vì điều đầu tiên mà nó đề cập là Windows và tôi đang dùng Linux. Nhưng bạn đã giải thích tại sao.
Tyler Collier

73

Bạn có thể định nghĩa một hàm shell.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

Tôi đã thấy điều này trên một trang stackoverflow khác, nhưng thiết bị đầu cuối cygwin của tôi nói rằng chức năng này không được nhận ra khi tôi cố chạy nó.
Stella

@Stella: Tôi đã để lại một trích dẫn kết thúc trong đó không hữu ích cú pháp tệp cấu hình này. Hãy chắc chắn rằng bạn không có nó.
Lily Ballard

2
Wow ... Thật không may, đây là tất cả các vấn đề về phiên bản. Tôi đã sử dụng Git 1.7.3 và cả hai phương pháp này đều không hoạt động. Tôi cập nhật lên 1.7.6 và voila, mọi thứ đều hoạt động. Cảm ơn các bạn!
Stella

5
Nếu sử dụng Windows, tôi nghĩ rằng bạn phải bao quanh định nghĩa hàm shell với dấu ngoặc kép"
drzaus

4
Câu trả lời của Olivier không hiệu quả với tôi khi sử dụng tham số (OSX). Điều này làm việc hoàn hảo.
Ohad Schneider

25

Tôi đã có thể tạo ra các bí danh git đa dòng và khá phức tạp. Chúng hoạt động tốt trên Windows nhưng tôi cho rằng chúng cũng hoạt động ở nơi khác, ví dụ:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

Tôi đã viết một bài và có một vài ví dụ ở đây .


2
một sự chấp thuận cho điều này sẽ là thêm !f() { : resetvào để có được sự hoàn thành từ lệnh thiết lập lại github.com/git/git/blob/master/contrib/completion/ trộm
một người dùng

Bạn đã làm rất tốt! Bài báo nào được xuất bản theo? Bạn có phiền nếu tôi dịch các phần của nó cho StackOverflow bằng tiếng Nga không?
Nick Volynkin 24/07/2015

@NickVolynkin Xin lỗi về việc trả lời trễ. Cảm ơn bạn và tất nhiên, hãy tiếp tục :)
VitalyB

22
[alias]
chs = !git branch && git status

8
Để làm gì !?
Ứng dụng tự động

1
Tôi không thể tìm thấy tài liệu cho !nhưng theo như tôi có thể thấy git theo mặc định sẽ cho rằng bí danh là một lệnh git nên t = statussẽ hoạt động. Tuy nhiên nếu bạn thử t = git statusnó sẽ không hoạt động (sẽ không tìm thấy lệnh "git"). Vì vậy, khi !xuất hiện, nó bảo nó chạy lệnh như thể nó là shell và thông thường bạn cần điều này khi bạn có nhiều lệnh git cho mỗi bí danh, vì vậy bạn có thể có t = !git status && git logví dụ và nó sẽ hoạt động.
laurent

Đây là một câu hỏi StackOverflow liên quan đến các dấu chấm than (!) Trong bí danh Git: stackoverflow.com/questions/21083933/ .
Jacob Lockard

6

Hãy thử cái này:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

Gọi nó như thế này: git chs master


6

Có thể có bí danh git đa dòng bằng cách nối \vào cuối mỗi dòng.

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
Cảm ơn! Tôi thực sự không có vấn đề sử dụng "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"cho bí danh của tôi.
Dropogans

3

Vấn đề ở đây là các tham số vị trí dường như được gửi đến lệnh shell hai lần (kể từ git 1.9.2). Để xem những gì tôi muốn nói, hãy thử điều này:

[alias]
  test = !git echo $*

Sau đó, làm git test this is my testing string. Bạn nên quan sát đầu ra sau (hai dòng cuối được chỉnh sửa ở đây cho rõ ràng):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

Một cách để giải quyết vấn đề này là

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

Điều này sẽ tiêu tốn tham số vị trí bổ sung khi nó được áp dụng cho lệnh echo cuối cùng đó và không ảnh hưởng đến kết quả.

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.