Git kullanarak bir changelog'u yönetmenin iyi yolları var mı?


214

Git'i bir süredir kullanıyorum ve son zamanlarda bültenlerimi etiketlemek için kullanmaya başladım, böylece değişiklikleri daha kolay takip edebiliyorum ve müşterilerimizin her birinin hangi sürümü çalıştırdığını görebiliyorum (maalesef kod şu anda zorunlu her istemcinin PHP sitesinin kendi kopyası var; bunu değiştiriyorum, ama yavaş gidiyor).

Her halükarda, biraz ivme kazanmaya başlıyoruz, insanlara son sürümden bu yana değişenleri göstermenin gerçekten iyi olacağını düşündüm. Sorun şu ki, ben bir changelog sürdürmüyorum çünkü bunun nasıl yapılacağı hakkında iyi bir fikrim yok. Bu belirli bir süre için, günlüğü çalıştırabilir ve manuel olarak bir tane oluşturabilirim, ancak bu çok çabuk yorulur.

Ben "git changelog" ve "git yönetmek changelog" googling denedim ama gerçekten kod değişikliklerinin iş akışı ve nasıl changelog ile çakışan hakkında konuştum bir şey bulamadık. Şu anda Rein Henrichs'in geliştirme iş akışını takip ediyoruz ve bununla birlikte giden bir şeyi çok isterim.

Eksik olduğum standart bir yaklaşım var mı, yoksa burası herkesin kendi işini yaptığı bir alan mı?

Yorumlarınız / cevaplarınız için çok teşekkürler!

Yanıtlar:


181

Bu yaklaşık 3-4 yıl önceydi, ancak gelecekteki araştırmacılar uğruna, şu şekilde muhteşem günlükler oluşturmak mümkün:

git log --oneline --decorate

Veya, daha güzel olmasını istiyorsanız (terminal için renk ile):

git log --oneline --decorate --color

Bu çıktıyı ChangeLog'a bağlamak şu anda tüm projelerimde kullandığım şey, şaşırtıcı.


4
Başka bir yararlı etiket, --graphtaahhütlerin hangi dallarda olduğunu görsel olarak gösterir.
Eruant

44
Hediye günlüğü farklarını
Olivier Lacan

4
git logÇıktıyı changelog dosyasına kopyalamanın bir anlamı yoktur. Okunabilir bir değişiklik günlüğüne sahip olmak için bir filtreleme ve düzenleme çalışması yapmanız gerekir, aksi halde neden bir değişiklik günlüğüne ihtiyacınız olsun? Bence bir changelog oluşturulmasını otomatikleştirebilirsiniz ama lütfen ham kopyasını yapmayın git log!
vaab

19
Bununla ilgili sorun, projenize her katkının net ve okunabilir taahhüt mesajları yazdığı varsayılarak bile, yine de tonlarca gürültü içeren bir "değişim günlüğü" üreteceğinizdir. Değişim günlükleri , projenizin kullanıcılarına , sürümler arasında meydana gelen kendileriyle ilgili dikkate değer değişiklikleri açıklamak amacıyla yazılmalıdır, oysa taahhüt mesajları geliştiricilere kodunuzda ne gibi iyileştirmeler yaptığını açıklamaya odaklanmalıdır . Bazen orada çakışma var, ama her zaman değil.
Ajedi32

7
Ya da, bunu biraz daha somut hale getirmek için, bu yöntem, "ZModule'de fooMethod'un sabit yazımı" ve "XYLibarary'nin yeni sürümünü kullanmak için Refactor XModule" gibi birçok giriş içeren bir "değişiklik günlüğü" oluşturur. Kullanıcılarınız bunu umursamıyor . Onlar değişiklikler yapılmıştır bilmek istiyorum onların , kullanıcıları olarak perspektiften değil senin bir geliştirici olarak bir perspektif. Ve hatta bu, "gerçek dünyadaki repoda bulunma olasılığı yüksek olan şeyleri" xdev / foo'dan PR # 123 birleştir "ve" Opps, sabit newFeature gibi çalışır "gibi şeyleri bile görmezden geliyor.
Ajedi32

60

Size yardımcı olmak için git log'un bazı lezzetlerini kullanabilirsiniz:

git log --pretty=%s                 # only print the subject

Dallarınızı güzel bir şekilde adlandırırsanız, master için bir birleştirme "Birleştirilmiş şube özelliği-foobar" gibi bir şey olarak görünürse, birleştirdiğiniz tüm küçük taahhütleri değil, yalnızca bu mesajı göstererek işleri kısaltabilirsiniz. özelliği:

git log --pretty=%s --first-parent  # only follow first parent of merges

Bunu, "Birleştirilmiş şube" bitlerini çıkarmak, biçimlendirmeyi normalleştirmek, vb. Gibi şeyler yapabilen kendi senaryolarınızla güçlendirebilirsiniz. Bir noktada elbette kendiniz yazmanız gerekir.

Ardından, sürüm başına bir kez değişiklik günlüğü için yeni bir bölüm oluşturabilirsiniz:

git log [opts] vX.X.X..vX.X.Y | helper-script > changelogs/X.X.Y

ve sürüm sürümünüzde bunu taahhüt edin.

Sorununuz bu taahhüt konularının bir değişim günlüğüne koymak istediğiniz gibi bir şey olmaması durumunda, hemen hemen iki seçeneğiniz vardır: her şeyi manuel olarak yapmaya devam edin (ve catch oynamak yerine daha düzenli bir şekilde yetişmeye çalışın- yayınlama zamanında) veya taahhütlü mesaj stilinizi düzeltin. Bir seçenek, eğer konular sizin için yapmayacaksa, taahhüt mesajlarınızın gövdelerine "değişim: eklenen özellik foobar" gibi satırlar yerleştirmek olacaktır, böylece daha sonra git log --pretty=%B | grep ^change:sadece o süperleri kapmak gibi bir şey yapabilirsiniz. -Mesajların önemli bitleri.

Değişim günlüklerinizi oluşturmanıza gerçekten bu git'ten ne kadar fazla yardımcı olabileceğinden tam olarak emin değilim. Belki de "yönetmek" ile ne demek istediğini yanlış yorumladım?


2
Bu kesinlikle harika bir başlangıç ​​ve daha sonra grep yapabilmek için vücuda bir değiştirici eklemeyi düşünmemiştim. Yaptığım şey bu olabilir. Geri dönüşünüz için teşekkür ederiz! Eğer ertesi gün içinde daha fazla cevap gelmezse, senin cevabı olarak işaretleyeceğim :-)
Topher Fangio

60

YASAL UYARI: Ben aşağıda konuşacağım gitchangelog yazarım .

TL; DR: gitchangelog'un kendi changelog'unu veya öncekini oluşturan ascii çıktısını kontrol etmek isteyebilirsiniz .

Git geçmişinizden bir değişiklik günlüğü oluşturmak istiyorsanız, muhtemelen şunları göz önünde bulundurmanız gerekir:

  • çıkış biçimi . (Saf özel ASCII, Debian changelog türü, Markdow, ReST ...)
  • bazı taahhüt filtreleme (muhtemelen yazım hatası veya kozmetik değişikliklerin değişim günlüğünüze girmesini istemezsiniz)
  • bazıları değişiklik günlüğüne dahil edilmeden önce metin atmayı taahhüt eder. (İletilerin bir ilk harf büyük harf veya son nokta olarak normalleştirilmesini sağlamak, ancak özette bazı özel işaretlemeleri de kaldırıyor olabilir)
  • sizin ise git geçmişi uyumlu ?. Birleştirme, etiketleme, çoğu araç tarafından her zaman kolay desteklenmez. Bu, geçmişinizi nasıl yönettiğinize bağlıdır.

İsteğe bağlı olarak bazı kategorizasyonlar (yeni şeyler, değişiklikler, hata düzeltmeleri) isteyebilirsiniz ...

Tüm bunları göz önünde bulundurarak, gitchangelog'u oluşturdum ve kullanıyorum . Önceki tüm hedeflere ulaşmak için bir git kesinleştirme mesaj kuralından yararlanılması amaçlanmıştır .

Güzel bir değişim günlüğü oluşturmak için bir taahhüt mesajı kuralına sahip olmak zorunludur (kullanarak veya kullanmadan gitchangelog).

mesaj sözleşmesi imzala

Aşağıda, tamamlama iletilerinize ekleme konusunda neyin yararlı olabileceğine ilişkin öneriler yer almaktadır.

Taahhütlerinizi kabaca büyük bölümlere ayırmak isteyebilirsiniz:

  • niyetle (örneğin: yeni, düzelt, değiştir ...)
  • nesneye göre (örneğin: doc, paketleme, kod ...)
  • kitleye göre (örneğin: geliştirici, test kullanıcısı, kullanıcılar ...)

Ayrıca, bazı taahhütleri etiketlemek de isteyebilirsiniz:

  • değişim günlüğünüze çıkmaması gereken "küçük" taahhütler olarak (kozmetik değişiklikler, yorumlardaki küçük yazım hataları ...)
  • Gerçekten önemli özellik değişiklikleriniz yoksa "refactor" olarak. Bu nedenle, örneğin son kullanıcıya görüntülenen değişiklik günlüğünün bir parçası olmamalı, ancak bir geliştirici değişiklik günlüğünüz varsa bazı ilgi çekici olabilir.
  • API değişikliklerini veya yeni API öğelerini işaretlemek için "api" ile de etiketleyebilirsiniz ...
  • ...vb...

Tamamlama mesajınızı kullanıcıları (işlevselliği) olabildiğince sık hedefleyerek yazmaya çalışın.

misal

Bu, git log --onelinebu bilgilerin nasıl saklanabileceğini göstermek için standarttır ::

* 5a39f73 fix: encoding issues with non-ascii chars.
* a60d77a new: pkg: added ``.travis.yml`` for automated tests. 
* 57129ba new: much greater performance on big repository by issuing only one shell command for all the commits. (fixes #7)
* 6b4b267 chg: dev: refactored out the formatting characters from GIT.
* 197b069 new: dev: reverse ``natural`` order to get reverse chronological order by default. !refactor 
* 6b891bc new: add utf-8 encoding declaration !minor 

Fark ettiyseniz, seçtiğim biçim:

{new|chg|fix}: [{dev|pkg}:] COMMIT_MESSAGE [!{minor|refactor} ... ]

Gerçek bir çıktı sonucu görmek için gitchangelog'un PyPI sayfasının sonuna bakabilirsiniz

Taahhüt mesajı kuralımın tam belgelerini görmek için gitchangelog.rc.reference başvuru dosyasını görebilirsiniz.

Bundan enfes değişim günlüğü nasıl oluşturulur

Sonra, tam bir değişiklik günlüğü yapmak oldukça kolaydır. Kendi komut dosyanızı oldukça hızlı bir şekilde yapabilir veya kullanabilirsiniz gitchangelog.

gitchangelogtam bir değişiklik günlüğü oluşturur (bölümleme desteği New, Fix... ile) ve kendi taahhüt kurallarınıza göre yapılandırılabilir. Bu yoluyla templating çıkış sayesinde her türlü destekler Mustache, Mako templatingve ham Python ile yazılmış bir varsayılan eski motoru var; Mevcut tüm 3 motorun nasıl kullanılacağına dair örnekleri var ve gitchangelog'un PyPI sayfasında görüntülenen gibi changelog'ları çıktılayabiliyorlar.

Eminim diğer bol olduğunu biliyorum ediyorum git logiçin changelogde orada araçları.


1
Bu harika, tam olarak aradığım şey. Bunu deneyeceğim, çok teşekkür ederim!
Jeff Kiiza


23

gitlog-to-changelogKomut dosyası GNU tarzı oluşturmak için kullanışlıdır ChangeLog.

Tarafından gösterildiği gibi gitlog-to-changelog --help, aşağıdaki seçeneklerden ChangeLogbirini kullanarak dosya oluşturmak için kullanılan taahhütleri seçebilirsiniz --since:

gitlog-to-changelog --since=2008-01-01 > ChangeLog

veya --sonradan iletilecek git-log(dahili olarak çağrılacak gitlog-to-changelog) ek argümanlar ileterek :

gitlog-to-changelog -- -n 5 foo > last-5-commits-to-branch-foo

Örneğin, Makefile.amprojelerimden birinin üst düzeyinde aşağıdaki kuralı kullanıyorum :

.PHONY: update-ChangeLog
update-ChangeLog:
    if test -d $(srcdir)/.git; then                         \
       $(srcdir)/build-aux/gitlog-to-changelog              \
          --format='%s%n%n%b%n' --no-cluster                \
          --strip-tab --strip-cherry-pick                   \
          -- $$(cat $(srcdir)/.last-cl-gen)..               \
        >ChangeLog.tmp                                      \
      && git rev-list -n 1 HEAD >.last-cl-gen.tmp           \
      && (echo; cat $(srcdir)/ChangeLog) >>ChangeLog.tmp    \
      && mv -f ChangeLog.tmp $(srcdir)/ChangeLog            \
      && mv -f .last-cl-gen.tmp $(srcdir)/.last-cl-gen      \
      && rm -f ChangeLog.tmp;                               \
    fi

EXTRA_DIST += .last-cl-gen

Bu kural, ChangeLoghenüz kaydedilmemiş en son kaydedilen mesajlarla güncellemek için sürüm zamanında kullanılır . Dosya .last-cl-gen, kaydedilen en son taahhüdün SHA1 tanımlayıcısını içerir ChangeLogve Git deposunda saklanır. ChangeLogdepoya da kaydedilir, böylece kayıt iletilerini değiştirmeden düzenlenebilir (örneğin, yazım hatalarını düzeltmek için).



Bu kazanan proje olmalı! Neden github'da yok?
Ömer Dagan

20

Sürüm başına etiket oluşturmak en iyi yöntem olduğundan, değişiklik günlüğünüzü sürüm başına bölümlemek isteyebilirsiniz. Bu durumda, bu komut size yardımcı olabilir:

git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B

15

İçin GitHub projelerinin yararlı olabilir: github-changelog-jeneratör

Etiketler kapalı sorunlardan changelog oluşturur ve birleştirilmiş çekme istekleri.

Bu CHANGELOG.md bu komut dosyası tarafından oluşturuldu.

Misal:

Değişiklikler

1.2.5 (2015-01-15)

Tam Değişiklik Günlüğü

Uygulanan geliştirmeler:

  • Hangi sürüm hatasının düzeltildiğini belirtmek için kilometre taşını kullanın # 22

Düzeltilen hatalar:

  • Etiketsiz repo için günlük oluşturmaya çalışırken hata oluştu # 32

Birleştirilmiş çekme istekleri:


Bu tür projeler en iyisidir :) Bunu yapmak için motivasyonunuz neydi? İlhamınız sayesinde etiketsiz çalışan, Eklenen / Değiştirilen / Sabit / Kaldırılan ve PHP ("anadil" dilim) olan benzer bir araç hazırladım: github.com/Symplify/ChangelogLinker Changlogs hakkında yazı yazıyor musunuz? ? Onları okumak istiyorum
Tomáš Votruba

1
@ TomášVotruba sıcak sözler için teşekkürler. Bu sadece benim hobim. Çok fazla mesaj atmadım. Ama bence buna değer. En iyi dileklerimle!
skywinder

10

Bunun için bir kütüphane de yaptım. Bıyık şablonu ile tamamen yapılandırılabilir. Şunları yapabilir:

Ayrıca:

Github hakkında daha fazla bilgi: https://github.com/tomasbjerre/git-changelog-lib

Komut satırından:

npx git-changelog-command-line -std -tec "
# Changelog

Changelog for {{ownerName}} {{repoName}}.

{{#tags}}
## {{name}}
 {{#issues}}
  {{#hasIssue}}
   {{#hasLink}}
### {{name}} [{{issue}}]({{link}}) {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
   {{/hasLink}}
   {{^hasLink}}
### {{name}} {{issue}} {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
   {{/hasLink}}
  {{/hasIssue}}
  {{^hasIssue}}
### {{name}}
  {{/hasIssue}}

  {{#commits}}
**{{{messageTitle}}}**

{{#messageBodyItems}}
 * {{.}} 
{{/messageBodyItems}}

[{{hash}}](https://github.com/{{ownerName}}/{{repoName}}/commit/{{hash}}) {{authorName}} *{{commitTime}}*

  {{/commits}}

 {{/issues}}
{{/tags}}
"

Veya Jenkins:

resim açıklamasını buraya girin


3
git log --oneline --no-merges `git describe --abbrev=0 --tags`..HEAD | cut -c 9- | sort

Kullanmaktan hoşlandığım şey bu. Son etiketten bu yana tüm taahhütleri alır. cuttaahhüt karma kurtulmak. Teslim mesajlarınızın başında bilet numaralarını kullanırsanız, bunlarla gruplandırılır sort. Sıralama fix, belirli taahhütlerin typovb. İle ön ek yapması durumunda da yardımcı olur .


3

CI sunucusunun aşağıdakileri, CHANGELOGyeni bir sürüm için adlandırılan dosyaya , release-dosya adında ayarlanan tarihle iletmesine izin verdim :

>git log --graph --all --date=relative --pretty=format:"%x09 %ad %d %s (%aN)"

2

Bir İçin GNU tarzı değişmek , ben işlevini pişirdim

gnuc() {
  {
    printf "$(date "+%Y-%m-%d")  John Doe  <john.doe@gmail.com>\n\n"
    git diff-tree --no-commit-id --name-only -r HEAD | sed 's/^/\t* /'
  } | tee /dev/tty | xsel -b
}

Bununla:

  • Değişikliklerimi, ChangeLog'da son düzenlemeyi yapmadan önce yedeklemek ve yeniden oluşturmak için düzenli aralıklarla taahhüt ediyorum
  • o zaman koş: gnuc

ve şimdi panomuzda şöyle bir şey var:

2015-07-24  John Doe  <john.doe@gmail.com>

        * gdb/python/py-linetable.c (): .
        * gdb/python/py-symtab.c (): .

Sonra Pano değiştirmek için başlangıç ​​noktası olarak kullanın.

Mükemmel değil (örneğin, dosyalar ChangeLog yoluna göre olmalıdır, bu yüzden düzenlemeden beri python/py-symtab.colmadan ), ancak iyi bir başlangıç ​​noktasıdır.gdb/gdb/ChangeLog

Daha gelişmiş komut dosyaları:

Gerçi Tromey ile aynı fikirde olmak zorunda: ChangeLog git taahhüt veri çoğaltmak işe yaramaz.

Bir değişiklik günlüğü yapacaksanız, muhtemelen http://keepachangelog.com/ adresinde belirtildiği gibi, neler olup bittiğinin iyi bir özetini yapın .


2

Dayanarak bithavoc , bu listeler last tagdek HEAD. Ancak 2 etiket arasındaki günlükleri listelemeyi umuyorum.

// 2 or 3 dots between `YOUR_LAST_VERSION_TAG` and `HEAD`
git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B

Günlükleri 2 etiket arasında listeleyin.

// 2 or 3 dots between 2 tags
git log FROM_TAG...TO_TAG

Örneğin, günlükleri listeler v1.0.0için v1.0.1.

git log v1.0.0...v1.0.1 --oneline --decorate

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.