Rozpocznij wiadomość git commit ze znakiem hash (#)

283

Git traktuje wiersze rozpoczynające się od #jako wiersze komentarza podczas zatwierdzania. jest to bardzo denerwujące podczas pracy z systemem śledzenia biletów i próby wpisania numeru biletu na początku linii, np.

#123 salt hashed passwords

git po prostu usunie wiersz z komunikatu zatwierdzenia. czy jest jakiś sposób na ucieczkę od skrótu? próbowałem \i !, ale nic nie działa. białe znaki wcześniej #są zachowywane, więc nie są również działającym rozwiązaniem problemu.

knittl
źródło
8
@AlexBudovski, ponieważ istnieje zwięzłość.
Xavi,
8
Od wersji git 1.8.2 (luty 2013) git config core.commentcharpozwala na konfigurację tego znaku komentarza. Zobacz moją odpowiedź poniżej
VonC
3
Od wersji Git 2.0.0 (2014.05.21) git commit --cleanup=scissorsbędzie bardziej elastyczny. Zobacz szczegóły w mojej odpowiedzi
Sungam,
4
Muszę powiedzieć, że jestem zaskoczony, że ludzie z GitHub nie myśleli o tym problemie, kiedy zdecydowali się oznaczyć numery problemów hashami!
Michael Scheper
1
@Michael Szczerze mówiąc, ta konwencja była już używana przez Mantis, Trac, Redmine i prawdopodobnie inne. Podejrzewam, że GitHub po prostu postanowił pójść za nim, zamiast wymyślać koło. Zobacz stackoverflow.com/questions/40495/…
Kelvin

Odpowiedzi:

235

To zachowanie jest częścią git commitdomyślnego zachowania „czyszczenia”. Jeśli chcesz, aby linie zaczynały się od #, możesz użyć alternatywnego trybu czyszczenia.

Na przykład

git commit --cleanup=whitespace

Jeśli to zrobisz, musisz uważać, aby usunąć wszystkie #wiersze, których nie chcesz pojawiać się w zatwierdzeniu.

CB Bailey
źródło
Następne pytanie brzmi: gdzie mogę edytować komentarze do zatwierdzenia, które git wprowadza, które zaczynają się domyślnie od #?
Alex
2
@Alex: Jest kontrolowany przez commit.templatezmienną konfiguracyjną git.
CB Bailey,
23
Działa to doskonale również do zmiany istniejących zatwierdzeń. Np .:git commit --amend --cleanup=whitespace
James Andres
@CharlesBailey: Oczekiwałem, że pozbędę się wstępnie zdefiniowanego tekstu za pomocą git commit -t / dev / null, ale wciąż to pokazuje
Alex
Ponieważ możesz mieć komunikat zatwierdzenia „# 123 Commit message”, a także komentarze w klientach, takich jak GitHub dla komputerów Mac i SourceTree, myślę, że to, co robią ci klienci, tak?
Phil Ostler
134

Zauważ, że od git1.8.2 (luty 2013) możesz użyć innego znaku niż „ #” w komentarzowym wierszu w komunikacie zatwierdzenia.

Dzięki temu możesz użyć „ #” jako numeru referencyjnego błędu.

Różne linie „podpowiedzi”, które Git podaje, gdy prosi użytkownika o edycję wiadomości w edytorze, są komentowane za pomocą „# domyślnie ”.

core.commentCharZmienna konfiguracja może być używany, aby dostosować ten „ #” na inny charakter.


Teoretycznie można umieścićcore.commentChar słowo (wiele znaków), ale git 2.0.x / 2.1 będzie bardziej restrykcyjne (Q3 2014).

Zobacz commit 50b54fd autor: Nguyễn Thái Ngọc Duy ( pclouds) :

config: bądź surowy na core.commentChar

Nie obsługujemy komentarzy ciągów (przynajmniej jeszcze nie). Wielobajtowe kodowanie znaków może być również źle interpretowane.

Test z dwoma przecinkami został zaktualizowany, ponieważ narusza to. Został dodany wraz z łatką wprowadzoną core.commentCharw eff80a9 (Zezwól na niestandardowy „komentarz char” - 16.01.2013). Nie jest dla mnie jasne, dlaczego takie zachowanie jest pożądane.


git 2.0.x / 2.1 (III kwartał 2014) doda automatyczny wybór dla core.commentChar:
Zobacz commit 84c9dc2

Kiedy core.commentCharjest „ auto”, znak komentarza zaczyna się od „# ” jak domyślnie, ale jeśli jest już w przygotowanej wiadomości, znajdź inny znak w małym podzbiorze. To powinno powstrzymać niespodzianki, ponieważ git niespodziewanie usuwa niektóre linie.

Pamiętaj, że git nie jest wystarczająco inteligentny, aby rozpoznać #znak komentarza w niestandardowych szablonach i przekonwertować go, jeśli końcowy znak komentarza jest inny.
Uważa linie „#” w niestandardowych szablonach za część komunikatu zatwierdzenia. Więc nie używaj tego z niestandardowymi szablonami.

Lista znaków kandydujących do „auto” to:

# ; @ ! $ % ^ & | :

Oznacza to, że takie polecenie git commit -m '#1 fixed issue'automatycznie przełączy zmienną commentChar na „ ;”, ponieważ „ #” zostało użyte w komunikacie zatwierdzenia.

VonC
źródło
1
Aby naprawić składnię HL po tym, zobacz to powiązane pytanie: stackoverflow.com/questions/16164624/...
Alois Mahdal
@Guten Prawda, przeredagowałem odpowiedź, aby to odzwierciedlić.
VonC
1
@newbyca z jaką wersją git, czy widzisz, że nie jest obsługiwany podczas interaktywnej bazy?
VonC
2
Aby to ustawić, możesz np .:$ git config --global core.commentchar ';'
davetapley
6
Uwielbiam tę odpowiedź. Oneliner dla nowego sugerowanego rozwiązania:git config --global core.commentChar auto
Aross
81

Odpowiedzi tutaj są dobre i szczegółowe, ale dla git noob, takiego jak ja, dostosowywanie opcji konfiguracji git nie jest tak oczywiste. Oto przykład, aby zmienić #na ;znaki komentarza:

git config core.commentChar ";"

To wszystko, co musisz zrobić.

Matthieu Napoli
źródło
3
Zmienia to również domyślny tekst komentarza, który git dodaje do wiadomości zatwierdzenia, gdy używa się go git commitdo otwarcia skonfigurowanego edytora do edycji wiadomości zatwierdzenia!
Michael Trouw
1
Aby uzyskać jednorazowe poprawki, użyj tego: git -c core.commentChar="|" commit --amend(zamień na |cokolwiek chcesz).
Droogany
62

Możesz użyć opcji wiersza poleceń -m:

git commit -m "#123 fixed"
Olivier Verdier
źródło
35
Ale to okropne przesłanie. pamiętaj, aby podać, jaki był błąd i jak go naprawić
Good Person
3
komunikaty zatwierdzeń są w porządku, o ile występuje szereg błędu
Trident D'Gao
6
Nie, jeśli system śledzenia błędów nagle zostanie uszkodzony i nie masz kopii zapasowej! :)
caveman_dick
38

Jeśli wykonujesz interaktywny rebase, to kiedy zapiszesz wiadomość zatwierdzenia bez niczego (ponieważ #na początku zrobił z niej komentarz i dlatego został zignorowany), git pokaże ci, co zrobić:

Aborting commit due to empty commit message.
Could not amend commit after successfully picking 5e9159d9ce3a5c3c87a4fb7932fda4e53c7891db... 123 salt hashed passwords
This is most likely due to an empty commit message, or the pre-commit hook
failed. If the pre-commit hook failed, you may need to resolve the issue before
you are able to reword the commit.
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

Więc po prostu popraw wiadomość:

git commit --amend -m "#123 salt hashed passwords"

i kontynuuj rebase:

git rebase --continue
Owain Williams
źródło
Jest to poprawne dla kogoś, kto już wypchnął zatwierdzenie, ale chce zmienić wiadomość
Hoang Trinh
Dotyczy to również nowych zatwierdzeń, jeśli wprowadzisz wiadomość za pomocą edytora i na początku ma ona skrót.
Owain Williams
29

git commit --cleanup=scissorsnależy użyć. Został dodany do Git v2.0.0 2014.05.21

z git commit --help

--cleanup=<mode>
  scissors
    Same as whitespace, except that everything from (and including) the line
    "# ------------------------ >8 ------------------------" is truncated if the message
    is to be edited. "#" can be customized with core.commentChar.
Sungam
źródło
Nie rozumiem, w jaki sposób jest to lepsze niż ręczne używanie commit.cleanup = whitespacei usuwanie # …komentarzy, jak już sugerował @CharlesBailey. scissors-mode dodatkowo czyści składnię nożyczek używaną przez git format-patch/ mailinfo/ am; to jednak nie używać …-- >8 --…podczas dodawania komentarza do popełnienia wiadomości składni .
Slipp D. Thompson
1. Myślę, że tak jest lepiej, ponieważ nie muszę „ # ...mocno usuwać komentarzy. 2. Nie jestem pewien co do drugiej części twojego komentarza, scissorstryb zdecydowanie jest w git commit --help. Z gitjakiej wersji korzystasz? @ SlippD.Thompson
Sungam
Co? whitespaceTryb oferuje usuwanie 1. początkowych i końcowych pustych linii, 2. końcowych białych znaków, 3. zwinięcie kolejnych pustych linii. scissorsoferuje usuwanie 1. początkowych i końcowych pustych linii, 2. końcowych białych znaków, 3. zwijać kolejne puste linie, 4. wszystkiego z linii (włącznie) # -…- >8 -…-. Jednak linie nożyczek ( # -…- >8 -…-) są wstawiane tylko przy użyciu git-format-patch/ mailinfo/ am. Dlatego w przypadku normalnego przepływu pracy git-commit/ merge/ rebase/ tryb usuwania zapewnia zero korzyści w porównaniu z trybem. v2.11.0cherry-pickscissorswhitespace
D. Thompson
@ SlippD.Thompson Jakiej wersji git używasz? Korzystam z wersji 2.8.3 i git commit --cleanup=scissors PRZED wstawiam # ------------------------ >8 ------------------------wiersz przed git statusinformacją. Jak poniżej: `# ------------------------> 8 ------------------- ----- # Nie dotykaj linii powyżej. # Wszystko poniżej zostanie usunięte. # On master master # # Wstępne zatwierdzenie # # Zmiany do zatwierdzenia: # nowy plik:
.gitignore
1
Myślę, że doszedłem do sedna tego. Git rzeczywiście wstawia # ------------------------ >8 ------------------------przed statusem txt „Wygląda na to, że możesz być…” _ podczas używania scissors; jednak wstawia linię nożyczki po tym # Conflicts: …tekście. Miałem commit.status = falseustawione w moim .gitconfig, więc nie widział dowolny tekst statusu, tylko tekst konfliktów. Poprawiono mnie; zmiana na głosowanie.
Slipp D. Thompson
3

Użyj innego prefiksu dla numeru biletu. Lub wstaw słowo do numeru biletu, na przykład „Bug # 42”. Lub wstaw pojedynczy znak spacji do linii; jeśli chcesz usunąć ten biały znak, możesz do tego dodać hak zatwierdzania.

Osobiście wolałbym, aby tego rodzaju manipulowanie wiadomościami zatwierdzającymi nie było wykonywane przez hak, ponieważ może być bardzo irytujące, gdy uruchamia się, gdy tego nie chcesz. Najłatwiejszym rozwiązaniem jest ponowne przemyślenie problemu.

wilhelmtell
źródło
1
inne sformułowanie stanowi jedynie obejście problemu. jeśli wytyczne projektu stwierdzą, że komunikat zatwierdzenia musi zaczynać się od identyfikatora biletu, to nie zadziała. a haczyk po zatwierdzeniu jest bardzo brzydki. myślę, że powinienem zgłosić ten „błąd” deweloperom git
knittl
Nie przejmuj się, to byłoby złe. Nie proś programistów git o pracę zgodnie z Twoimi wytycznymi. Nie poprosiłbyś Dennisa Ritchiego o zmianę języka C, aby obsługiwał on konwencję nazw zmiennych rozpoczynającą się od znaku skrótu, prawda? To samo dotyczy tutaj. Jeśli komunikaty zatwierdzania zezwalają na komentarze, dodaje to obsługę interesujących rzeczy, takich jak otwarcie edytora zatwierdzeń z dodanym i skomentowanym plikiem różnic, abyś nie musiał pamiętać dokładnych zmian. Co jest złego w zachowaniu wiodącej postaci kosmicznej?
wilhelmtell
1
obsługa znaków ucieczki w komunikacie zatwierdzenia gita nie byłaby tak wielkim problemem
knittl
5
Jest to całkowicie uzasadnione żądanie funkcji. Zwłaszcza w świetle faktu, że Trac, AFAICT, nie kojarzy zatwierdzenia z odcinkiem błędu, jeśli komunikat zatwierdzenia nie zaczyna się od numeru odcinka, zaczynając od skrótu. Więc to nie tylko czyjeś standardy, to wymagana składnia narzędzia. Niech twórcy Git zdecydują, czy warto, czy nie. (I tak, Trac może również rozwiązać problem. Nie ma nic złego w proszeniu Gita, aby zrobił to, co może.)
Luke Maurer,
„Zwłaszcza w świetle faktu, że Trac, AFAICT, nie przypisuje zatwierdzenia do dokumentu błędu, jeśli komunikat zatwierdzenia nie zaczyna się od numeru potwierdzenia, zaczynając od skrótu.” - z mojego ograniczonego doświadczenia w Trac, coś takiego jak #xxxwystępowanie w dowolnym miejscu w komunikacie zatwierdzenia spowoduje link do problemu. Nie musi być na początku zatwierdzenia. Może to coś się zmieniło w ciągu ostatnich pięciu lat?
Guildenstern,
1

Wszystkie moje zobowiązania zaczynają się od, #issueNumberwięc umieściłem ten bojler na moim vim .git/hooks/commit-msg:

NAME=$(git branch | grep '*' | sed 's/* //') 
echo "$NAME"' '$(cat "$1") > "$1"

Załóżmy więc, że mamy gałąź #15i wysyłamy komunikat zatwierdzenia add new awesome feature. Przy takim podejściu pojawi się komunikat końcowego zatwierdzenia #15 add new awesome feature.

valignatev
źródło