2011-07-08 21 views
7

Tôi muốn đảm bảo rằng cam kết mới nhất của tôi có ngày hiện tại trước khi tôi đẩy. Vì tôi luôn luôn rebase để làm chủ trước khi hợp nhất + push, tôi đã tạo bí danh này:bí danh git với tham số tùy chọn

Vấn đề là, nó tiếp tục khởi chạy trình soạn thảo văn bản của tôi yêu cầu thư cam kết mới. Có cách nào để có một tham số tùy chọn, vì vậy mà tôi có thể chọn để sử dụng một trong hai:

git sync 'my commit message' 

hoặc

git sync 

hợp tổ chức đó chỉ đơn giản là sẽ sử dụng hiện cam kết thông báo, bất cứ điều gì sẽ xảy ra là ?

+0

Bản sao có thể có của http://stackoverflow.com/q/3321492/923794 – cfi

Trả lời

12

Để áp dụng các thông số bổ sung cho bất kỳ điều gì ngoại trừ phần cuối của dòng lệnh "bí danh" của bạn, bạn sẽ cần phải đặt các lệnh shell của mình trong tập lệnh. Bạn có thể làm điều đó với một kịch bản bên ngoài (như jdelStrother’s answer), hoặc bạn có thể làm điều đó với một kịch bản shell "nội tuyến".

Bạn có thể sử dụng để nuôi -mgit commit nhắn mới của bạn hoặc sử dụng tùy chọn -C HEAD/--reuse-message=HEAD để có nó sử dụng thông điệp hiện có và là tác giả (nó cũng sẽ tái sử dụng các dấu thời gian tác giả, nhưng bạn đang đặt lại rằng với --date=…). Sử dụng bất kỳ tùy chọn nào trong số các tùy chọn này sẽ ngăn Git mở trình chỉnh sửa cho thông báo cam kết của bạn.

Ở đây nó là như một “inline” shell script:

git config --global alias.sync '!sh -c '\''git commit --amend --date=today ${1+-m} "${1---reuse-message=HEAD}" && git rebase master'\'' -' 

Cốt lõi của kịch bản nhỏ này là cặp mở rộng tham số điều kiện:

${1+-m} "${1---reuse-message=HEAD}" 

Khi bạn gọi nó với một phụ tham số (tức là thông điệp nhật ký thay thế của bạn), các thông số này mở rộng thành hai từ vỏ: -m "<your new log message>". Khi bạn không cung cấp thông số bổ sung, chúng sẽ mở rộng thành một từ duy nhất: "--reuse-message=HEAD".

Dấu gạch ngang sau cũng rất quan trọng; nó có thể là bất kỳ từ shell nào, điểm là cái gì đó phải ở đó vì shell sẽ sử dụng nó để khởi tạo tham số $0 (thường có giá trị mặc định, vì vậy nó vô ích đối với bản mở rộng có điều kiện).


Nếu tôi hiểu lầm và bạn thực sự muốn nhìn thấy các biên tập viên khi bạn không cung cấp các tham số phụ, sau đó sử dụng mở rộng đơn ${1+-m "$1"} thay cho cặp mở rộng.

+0

--reuse-message = HEAD chỉ là những gì tôi đang tìm kiếm, tuy nhiên tập lệnh không hoạt động như tôi mong đợi. Lệnh cam kết dường như sử dụng thông báo hiện tại bất kể tôi có cung cấp tham số hay không, và lệnh rebase luôn quay trở lại với lỗi: Khi không có tham số nào được cung cấp, tôi nhận được 'gây tử vong: Cần sửa đổi đơn master thượng nguồn không hợp lệ' Khi tham số được cung cấp Tôi nhận được 'Sử dụng: git rebase ...' – ceramica

+0

@ceramica Nó hoạt động cho tôi (cả việc đưa ra một thông điệp mới và sử dụng lại thông điệp cũ, cũng như lần rebase tiếp theo), nhưng tôi phải sử dụng cái gì đó ngoài '- date = today', vì nó không hợp lệ. Tôi đã sử dụng '--date =" $ (date "+% s% z") "' thay vào đó - lệnh chính xác mà tôi đã sử dụng để tạo bí danh (đó là làm việc cho tôi) là 'git config --global alias.sync ' ! sh -c '\' 'git commit --amend --date = "$ (ngày" +% s% z ")" $ {1 + -m} "$ {1 --- sử dụng lại-tin nhắn = HEAD} "&& git rebase master '\' '-''. –

+0

Cuối cùng tôi đã nhận được nó để làm việc nhưng tôi đã phải tự thay đổi bí danh trong .gitconfig của tôi thành: '"! Sh -c 'git commit --amend --date = today $ {1 + -m} \ "$ {1 --- "reuse-message = HEAD} \"; git rebase master '- "' Tôi không biết tại sao nó cần thêm dấu ngoặc kép, nhưng sự cần thiết cho ';' để tách các lệnh cho thấy lệnh đầu tiên không thành công. Tuy nhiên, nó có vẻ hoạt động tốt. – ceramica

6

Khi bí danh của bạn bắt đầu trở nên phức tạp hơn, có lẽ dễ nhất là tạo một tập lệnh riêng biệt cho chúng. Nếu bạn thêm tệp 'git-sync' vào đường dẫn của mình, tệp sẽ tự động được gọi khi bạn 'đồng bộ hóa git'.

Vì vậy, nếu bạn đã tạo tập tin đó với một cái gì đó dọc theo dòng -

#!/bin/sh 

if [ -z "$1" ]; then 
    git commit --amend --date=today 
else 
    git commit --amend --date=today -m "$1" 
fi 
git rebase master 

- đó có lẽ sẽ làm việc. Nó được gõ ra khỏi đỉnh đầu của tôi mặc dù, vì vậy caveat lector.

+0

Ý tưởng là âm thanh, nhưng tập lệnh này không thực hiện thực thi có điều kiện ('&&') giống như mã ban đầu của OP. –