Mulai pesan git commit dengan tanda pagar (#)


283

Git memperlakukan baris yang dimulai dengan #sebagai baris komentar ketika melakukan. ini sangat menjengkelkan ketika bekerja dengan sistem pelacakan tiket, dan mencoba menulis nomor tiket di awal baris, misalnya

#123 salt hashed passwords

git hanya akan menghapus baris dari pesan komit. apakah ada cara untuk menghindari hash? saya mencoba \dan !, tetapi tidak ada yang berhasil. spasi putih sebelumnya #dilestarikan, jadi itu juga bukan solusi yang baik untuk masalah tersebut.


8
@AlexBudovski karena ada nilai singkatnya.
Xavi

8
Sejak git 1.8.2 (Februari 2013), git config core.commentcharmemungkinkan untuk mengkonfigurasi karakter komentar itu. Lihat jawaban saya di bawah ini
VonC

3
Sejak Git v2.0.0 (2014.05.21) git commit --cleanup=scissorsakan lebih fleksibel. Lihat detail dalam jawaban saya
Sungam

4
Saya harus mengatakan, saya terkejut orang-orang GitHub tidak memikirkan masalah ini ketika mereka memutuskan untuk menandai nomor terbitan dengan hash!
Michael Scheper

1
@Michael Agar adil, konvensi ini sudah digunakan oleh Mantis, Trac, Redmine dan mungkin yang lainnya. Saya kira GitHub baru saja memutuskan untuk mengikutinya alih-alih menciptakan kembali roda. Lihat stackoverflow.com/questions/40495/…
kelvin

Jawaban:


235

Perilaku ini adalah bagian dari perilaku git commit'pembersihan' default. Jika Anda ingin menjaga garis mulai dari# Anda dapat menggunakan mode pembersihan alternatif.

Misalnya

git commit --cleanup=whitespace

Jika Anda melakukan ini, Anda harus berhati-hati untuk menghapus semua #baris yang Anda tidak ingin muncul di komit.


Pertanyaan selanjutnya adalah: Di mana saya dapat mengedit komentar pesan komit yang memperkenalkan git yang dimulai secara default dengan #?
Alex

2
@Alex: Dikontrol oleh commit.templatevariabel konfigurasi git.
CB Bailey

23
Ini berfungsi baik untuk mengubah komitmen yang ada juga. Contoh:git commit --amend --cleanup=whitespace
James Andres

@CharlesBailey: Saya mengharapkan untuk menyingkirkan teks yang sudah ditentukan sebelumnya dengan git commit -t / dev / null tetapi masih menunjukkan bahwa
Alex

Karena Anda dapat memiliki pesan komit "# 123 Pesan Komit" serta komentar di klien seperti GitHub untuk Mac dan SourceTree, saya kira apa yang dilakukan klien ini?
Phil Ostler

134

Perhatikan bahwa, sejak git1.8.2 (Februari 2013) , Anda dapat menggunakan karakter yang berbeda dari ' #' untuk baris yang dikomentari dalam pesan komit.

Itu memungkinkan Anda menggunakan ' #' untuk referensi nomor bug Anda.

Berbagai baris "petunjuk" yang diberikan Git ketika meminta pengguna untuk mengedit pesan di editor dikomentari dengan ' #' secara default.

The core.commentCharvariabel konfigurasi dapat digunakan untuk menyesuaikan 'ini #' untuk karakter yang berbeda.


Secara teori, Anda bisa meletakkan core.commentCharkata (banyak karakter), tetapi git 2.0.x / 2.1 akan lebih ketat (Q3 2014).

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

config: ketat pada core.commentChar

Kami tidak mendukung string komentar (setidaknya belum). Dan pengkodean karakter multi-byte juga bisa disalahartikan.

Tes dengan dua koma diperbarui karena melanggar ini. Itu ditambahkan dengan tambalan yang memperkenalkan core.commentChardi eff80a9 (Izinkan custom "comment char" - 2013-01-16). Tidak jelas bagi saya mengapa perilaku itu diinginkan.


git 2.0.x / 2.1 (Q3 2014) akan menambahkan pilihan otomatis untuk core.commentChar:
Lihat commit 84c9dc2

Ketika core.commentChar" auto", char komentar dimulai dengan ' #' sebagai default tetapi jika sudah dalam pesan yang disiapkan, cari char lain di subset kecil. Ini harus menghentikan kejutan karena git menghapus beberapa baris secara tidak terduga.

Perhatikan bahwa git tidak cukup pintar untuk mengenali ' #' sebagai karakter komentar di template khusus dan mengonversinya jika karakter komentar akhir berbeda.
Ia menganggap baris '#' dalam templat khusus sebagai bagian dari pesan komit. Jadi jangan gunakan ini dengan template khusus.

Daftar karakter kandidat untuk "otomatis" adalah:

# ; @ ! $ % ^ & | :

Itu berarti perintah seperti git commit -m '#1 fixed issue'akan secara otomatis mengalihkan commentChar ke ' ;', karena ' #' digunakan dalam pesan komit.


1
Untuk memperbaiki sintaks HL setelah ini, lihat pertanyaan terkait ini: stackoverflow.com/questions/16164624/…
Alois Mahdal

@ Guten Benar, saya telah menulis ulang jawaban untuk mencerminkan itu.
VonC

1
@newbyca dengan versi git apa yang Anda lihat tidak didukung selama rebase interaktif?
VonC

2
Jadi, untuk mengatur ini Anda dapat melakukan, misalnya:$ git config --global core.commentchar ';'
davetapley

6
Saya suka jawaban ini. Oneliner untuk solusi yang disarankan baru:git config --global core.commentChar auto
aross

81

Jawaban di sini bagus dan terperinci, tetapi untuk git noob seperti saya menyesuaikan opsi konfigurasi git tidak begitu jelas. Berikut adalah contoh untuk mengubah dari #ke ;untuk karakter komentar:

git config core.commentChar ";"

Itu semua yang perlu Anda lakukan.


3
Ini juga mengubah teks komentar standar yang ditambahkan git ke pesan komit ketika seseorang menggunakan git commituntuk membuka editor yang dikonfigurasi untuk mengedit pesan komit!
Michael Trouw

1
Untuk perbaikan satu kali, gunakan ini: git -c core.commentChar="|" commit --amend(ganti |dengan apa pun yang Anda inginkan).
Droogans

62

Anda dapat menggunakan opsi baris perintah -m:

git commit -m "#123 fixed"

35
Tapi ini adalah pesan komit yang mengerikan. pastikan untuk memasukkan apa bug itu dan bagaimana memperbaikinya
Good Person

3
pesan komit tidak apa-apa asalkan ada sejumlah bug
Trident D'Gao

6
Tidak jika sistem pelacakan bug tiba-tiba rusak dan Anda tidak memiliki cadangan! :)
caveman_dick

38

Jika Anda melakukan rebase interaktif, maka ketika Anda menyimpan pesan komit Anda tanpa isi di dalamnya (karena #pada awalnya telah memberikan komentar dan karenanya diabaikan) git akan menunjukkan kepada Anda apa yang harus dilakukan:

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

Jadi, ubah saja pesannya:

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

dan lanjutkan rebase:

git rebase --continue

Ini benar untuk seseorang yang sudah mendorong komit, tetapi ingin mengubah pesan
Hoang Trinh

Ini juga berlaku untuk komit baru jika Anda memasukkan pesan menggunakan editor Anda dan memiliki hash di awal.
Owain Williams

29

git commit --cleanup=scissorsseharusnya digunakan. Ini ditambahkan ke Git v2.0.0 pada 2014.05.21

dari 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.

Saya tidak mengerti bagaimana ini lebih baik daripada menggunakan commit.cleanup = whitespacedan menghapus # …komentar dengan tangan, seperti yang disarankan oleh @CharlesBailey. scissors-mode hanya tambahan membersihkan sintaks-gunting yang digunakan oleh git format-patch/ mailinfo/ am; itu tidak menggunakan …-- >8 --…sintaks saat menambahkan komentar untuk melakukan pesan .
Slipp D. Thompson

1. Saya pikir ini lebih baik karena saya tidak perlu "menghapus # ...komentar dengan susah payah. 2. Saya tidak begitu yakin tentang bagian kedua dari komentar Anda, scissorsmodenya jelas dalam git commit --help. Versi apa gityang Anda gunakan? @ SlippD.Thompson
Sungam

Hah? whitespacemode menawarkan pengupasan 1. baris kosong terkemuka dan tertinggal, 2. spasi kosong, 3. runtuh baris kosong berturut-turut. scissorsmenawarkan pengupasan 1. baris kosong terkemuka dan tertinggal, 2. spasi kosong, 3. runtuh baris kosong berurutan, 4. semuanya dari (dan termasuk) jalur # -…- >8 -…-. Namun, garis gunting ( # -…- >8 -…-) hanya disisipkan saat menggunakan git-format-patch/ mailinfo/ am. Oleh karena itu untuk alur kerja normal git-commit/ merge/ rebase/ cherry-pick, scissorsmode pengupasan menawarkan manfaat nol dibandingkan whitespacemode. v2.11.0
Slipp D. Thompson

@ SlippD.Thompson Versi git apa yang Anda gunakan? Saya menggunakan 2.8.3 dan git commit --cleanup=scissors TIDAK MEMULIAKAN # ------------------------ >8 ------------------------baris sebelum git statusinfo. Seperti di bawah ini: `# ------------------------> 8 ------------------- ----- # Jangan menyentuh garis di atas. # Segala sesuatu di bawah ini akan dihapus. # Pada master cabang # # Komit awal # # Perubahan untuk dikomit: # file baru: .gitignore `
Sungam

1
Saya percaya saya sudah sampai di bagian bawah ini. Git memang memasukkan # ------------------------ >8 ------------------------sebelum txt status "Sepertinya Anda mungkin ..." _ saat menggunakan scissors; Namun, itu menyisipkan baris gunting setelah itu # Conflicts: …teks. Saya telah commit.status = falsemengatur di saya .gitconfig, jadi saya tidak melihat teks status, hanya teks konflik. Saya berdiri dikoreksi; mengubah ke upvote.
Slipp D. Thompson

3

Gunakan awalan berbeda untuk nomor tiket. Atau tambahkan kata ke nomor tiket, seperti "Bug # 42". Atau tambahkan satu karakter spasi ke baris; jika Anda ingin menghapus spasi itu, Anda dapat menambahkan komit-kait untuk itu.

Saya pribadi lebih suka tidak melakukan manipulasi pesan komit semacam ini dilakukan oleh sebuah pengait karena bisa sangat menjengkelkan ketika dipicu ketika Anda tidak menginginkannya. Solusi termudah mungkin adalah memikirkan kembali masalahnya.


1
kata-kata yang berbeda hanyalah solusi untuk masalah tersebut. jika pedoman proyek menyatakan bahwa pesan komit harus dimulai dengan id tiket, maka itu tidak akan berfungsi. dan kait pasca-komit sangat jelek. saya pikir saya harus melaporkan "bug" ini ke pengembang git
knittl

Jangan repot-repot, itu salah. Jangan minta pengembang git bekerja sesuai dengan panduan Anda. Anda tidak akan meminta Dennis Ritchie untuk mengubah bahasa C sehingga mendukung Anda nama variabel konvensi dimulai dengan karakter hash, kan? Hal yang sama berlaku di sini. Jika pesan komit memungkinkan komentar maka ini menambahkan dukungan untuk hal-hal menarik, seperti membuka editor komit dengan diff yang ditambahkan dan dikomentari sehingga Anda tidak perlu mengingat perubahan yang tepat. Apa yang salah dengan mempertahankan karakter ruang terkemuka?
wilhelmtell

1
mendukung karakter pelarian dalam pesan komit git tidak akan menjadi masalah besar
knittl

5
Ini permintaan fitur yang sangat masuk akal. Terutama mengingat fakta bahwa Trac, AFAICT, tidak mengaitkan komit ke slip bug jika pesan komit tidak dimulai dengan nomor slip, dimulai dengan hash. Jadi ini bukan hanya standar seseorang, itu adalah sintaks yang diperlukan alat. Biarkan para pengembang Git memutuskan apakah itu berharga atau tidak. (Dan ya, Trac juga bisa memperbaiki masalahnya. Tidak ada yang salah dengan meminta Git melakukan apa yang bisa dilakukan.)
Luke Maurer

"Terutama mengingat fakta bahwa Trac, AFAICT, tidak mengaitkan komit ke slip bug jika pesan komit tidak dimulai dengan nomor slip, dimulai dengan hash." - dalam pengalaman saya yang terbatas dengan Trac, sesuatu seperti #xxxterjadi di mana saja di pesan komit akan menghubungkan ke masalah ini. Itu tidak harus di awal komit. Mungkin ini adalah sesuatu yang telah berubah dalam lima tahun terakhir?
Guildenstern

1

Semua komit saya dimulai dengan #issueNumberjadi saya menempatkan boilerplate ini ke vim .git/hooks/commit-msg:

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

Jadi anggaplah kita memiliki cabang #15dan kita membuat pesan komit add new awesome feature. Dengan pendekatan ini pesan komit akhir akan #15 add new awesome feature.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.