2011-07-08 13 views
7

Chcę się upewnić, że moje ostatnie zatwierdzenie ma aktualną datę przed wysłaniem. Od zawsze zmieniają bazę do opanowania przed naciśnięciem scalania +, zrobiłem ten alias:alias git z opcjonalnym parametrem

[alias] 
    sync = !git commit --amend --date=today && git rebase master 

Problem w tym, że wciąż uruchomienie mojego edytora tekstu z prośbą o nowej popełnienia wiadomości. Czy istnieje sposób, aby mieć opcjonalny parametr, tak, że mogę wybrać albo:

git sync 'my commit message' 

lub

git sync 

gdzie ten ostatni po prostu wykorzystać istniejące popełnić wiadomość, co zdarza się ?

+0

Prawdopodobny duplikat http://stackoverflow.com/q/3321492/923794 – cfi

Odpowiedz

12

Aby zastosować dodatkowe parametry do wszystkiego poza końcem aliasu "wiersz poleceń", będziesz musiał umieścić polecenia powłoki w skrypcie. Możesz to zrobić za pomocą zewnętrznego skryptu (np. jdelStrother’s answer) lub możesz to zrobić za pomocą skryptu powłoki "inline".

Można użyć -m karmić git commit swoją nową wiadomość lub wybierz opcję -C HEAD/--reuse-message=HEAD aby go wykorzystać istniejącą wiadomość i Autor (to również ponowne użycie autor datownika, ale jesteś resetowanie że z --date=…). Użycie którejkolwiek z tych opcji uniemożliwi Gitowi otwarcie edytora wiadomości zatwierdzenia.

Tu jest jako „inline” skrypt powłoki:

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

Rdzeniem tego małego skryptu jest para warunkowych rozszerzeń parametrów:

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

Po wywołaniu go z dodatkowym Parametr (tj. komunikat o zastąpieniu dziennika), rozwijają się do dwóch słów powłoki: -m "<your new log message>". Jeśli nie podasz dodatkowego parametru, rozwiną się one do pojedynczego słowa: "--reuse-message=HEAD".

Ważne jest również końcowe kreskowanie; może to być dowolne słowo powłoki, chodzi o to, że coś musi tam być, ponieważ powłoka użyje go do zainicjowania swojego parametru $0 (który zwykle ma wartość domyślną, więc jest bezużyteczny dla samego rozszerzenia warunkowego).


Gdybym źle i rzeczywiście chcesz zobaczyć edytor, jeśli nie dostarczać dodatkowego parametru, a następnie użyć jednego ekspansję ${1+-m "$1"} zamiast parę rozszerzeń.

+0

--reuse-message = HEAD jest właśnie tym, czego szukałem, jednak skrypt nie działa tak, jak się spodziewałem. Wydaje się, że komenda commit używa istniejącego komunikatu, niezależnie od tego, czy dostarczę parametr, a polecenie rebase zawsze wraca z błędem: gdy nie podano parametru, otrzymuję komunikat "fatal: Needed a single revision invalid upstream master" Gdy parametr jest dostarczany Dostaję 'Usage: git rebase ...' – ceramica

+0

@ceramica Działa to dla mnie (zarówno daje nową wiadomość i ponowne wykorzystanie starej wiadomości, jak i późniejszy rebase), ale muszę użyć czegoś poza '- date = today', ponieważ to nie jest poprawne. Użyłem '--date =" $ (date "+% s% z") "zamiast tego - dokładne polecenie, którego użyłem do utworzenia aliasu (który działa dla mnie) to' git config --global alias.sync ' ! sh -c '\' 'git commit --amend --date = "$ (date" +% s% z ")" $ {1 + -m} "$ {1 --- reuse-message = HEAD} "&& git master" ##################. –

+0

W końcu udało mi się go uruchomić, ale musiałem ręcznie zmienić alias w moim pliku .gitconfig na: '"! Sh -c 'git commit --amend --date = today $ {1 + -m} \ "$ {1 --- reuse-message = HEAD} \ "; git rebase master '-" 'Nie wiem, dlaczego potrzebuje dodatkowych znaków cudzysłowu, ale potrzeba"; "rozdzielenia poleceń sugeruje, że pierwsza z nich się nie udała. Wydaje się jednak, że działa dobrze. – ceramica

6

Kiedy twoje aliasy zaczynają być coraz bardziej złożone, najprawdopodobniej najłatwiej jest stworzyć dla nich osobny skrypt. Jeśli dodasz plik 'git-sync' do swojej ścieżki, zostanie on automatycznie wywołany, gdy wykonasz 'git sync'.

Tak więc, jeśli ten plik stworzył coś na wzór -

#!/bin/sh 

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

- które prawdopodobnie działają. Zrobiłem to z mojej głowy, więc krytykuj lektora.

+0

Pomysł jest dobry, ale ten skrypt nie wykonuje warunkowej realizacji ('&&') takiej jak oryginalny kod OP. –