2013-05-24 108 views
12

Tôi đang cố viết một bí danh để xóa cả một nhánh cục bộ và từ xa cùng một lúc, nhưng tôi không thể hiểu tại sao cú pháp không hoạt động. Trong ~/.gitconfig, tôi đã thử các bí danh sau đây, nhưng mỗi sản xuất cùng một kết quả, đó là bất ngờ:bí danh git để xóa địa phương và từ xa

[alias] 
    nuke = !sh -c 'git branch -D $1 && git push origin :$1' 

[alias] 
    nuke = !git branch -D $1 && git push origin :$1 

cả sản phẩm:

$> git branch 
    * master 
    mybranch 
$> git nuke mybranch 
Everything up-to-date 
$> git branch 
    * master 
    mybranch 

Switching thứ tự các lệnh tạo ra một kết quả khác, nhưng cũng không hoàn toàn là những gì tôi đang tìm kiếm:

[alias] 
    nuke = !git push origin :$1 && git branch -D $1 

... 

$> git branch 
    * master 
    mybranch 
$> git nuke mybranch 
Everything up-to-date 
Deleted branch mybranch (was d719895) 
$> git branch 
    * master 
$> git push origin :mybranch 
To [email protected]:biegel/repo.git 
- [deleted]   mybranch 

Khi tôi chạy lệnh đó trực tiếp trên vỏ, nó hoạt động độc đáo:

$> git branch 
* master 
    mybranch 
$> git branch -D mybranch && git push origin :mybranch 
Deleted branch mybranch (was d719895 
To [email protected]:biegel/repo.git 
- [deleted]   mybranch 
$> git branch 
* master 

Tôi đã cố gắng tạo ra một bí danh trong ~/.bashrc, sử dụng git push origin --delete $1 và sử dụng một chức năng vỏ với !f() { }; và không có gì dường như mất!

Tôi đã sẵn sàng từ bỏ. Bất kỳ suy nghĩ về những gì tôi đang thiếu ở đây?

Cảm ơn.

Trả lời

24

Bạn có thể thực hiện công việc này tốt. Bạn chỉ cần thêm một thiếu '-' ở cuối định nghĩa của bạn. Các '-' sẽ là dấu hiệu để bash rằng tất cả các xử lý tùy chọn được thực hiện, và bất cứ điều gì xảy ra sau khi trở thành một tham số bạn có thể tham khảo qua $1, $2, vv:

[alias] 
    nuke = !sh -c 'git branch -D $1 && git push origin :$1' - 
0

Bạn không thể sử dụng $1 trong bí danh. Tạo một tập lệnh có tên là git-nuke ở đâu đó trong đường dẫn của bạn để bạn có quyền truy cập vào kịch bản lệnh shell thích hợp.

Bạn cũng có thể chỉ cần cài đặt git-extras. Đó là một trình biên dịch tập lệnh có chứa tập lệnh git delete-branch, thực hiện chính xác những gì bạn muốn.

+0

Ah, cảm ơn cho con trỏ. Tôi có thể sẽ đi với git-extras. – biegel

+4

Vui lòng xem câu trả lời của [jszakmeister] (http://stackoverflow.com/a/16740731/456814), bạn ** có thể ** sử dụng '$ 1' trong một bí danh. –

+0

Trong khi câu trả lời của jszakmeister là một giải pháp tốt đẹp thực sự, bạn vẫn không thể sử dụng '$ 1' trong một bí danh. 'sh' đang xử lý' $ 1' ở đó. Các đối số cho một bí danh luôn được nối thêm vào nó. – Chronial

2

Nếu bạn tạo một bin gọi git-nuke và đặt nó trong một thư mục ở bất kỳ đâu trên $PATH, bạn sẽ đạt được hiệu quả tương tự. Ưu điểm của phương pháp này là khả năng viết một lệnh với độ rõ ràng và mạnh mẽ hơn một chút.

Ví dụ, trong tiểu sử bash của tôi, tôi có: export PATH="$HOME/.bin:$PATH".

Và trong ~/.bin/git-nuke, tôi có:

#!/bin/bash 
set -eu 

# 
# git nuke <branch-name> 
# 
# Delete a branch (irrespective of its merged status) and 
# remove from origin. 
# 

echo "Nuking $1 ..." 

if git show-branch "$1" > /dev/null 2>&1 
then 
    git branch -D "$1" 
else 
    echo "No local branch to delete" 
fi 

git remote prune origin 
if git show-branch "origin/$1" > /dev/null 2>&1 
then 
    echo "Deleting remote $1 ..." 
    git push origin ":$1" 
else 
    echo "No remote branch to delete" 
fi 
+1

Một ưu điểm khác của việc này là bạn có thể thêm tự động hoàn thành. –