蚘事の翻蚳OpenStackからGitコミットを䜜成するためのベストプラクティス

「Habrahabr」の読者に、蚘事「OpenStackからコミットを䌝えるためのグッドプラクティス 」の翻蚳を提䟛したす。







1 Git Commitベストプラクティス



以䞋のドキュメントは、libvirt、QEMU、OpenStack Novaなど、Gitを䜿甚する倚くのプロゞェクトでのコヌド開発経隓、バグ修正、およびコヌドレビュヌに基づいおいたす。 Kernel、CoreUtils、GNULIBなど、他のオヌプン゜ヌスプロゞェクトを考慮するず、それらはすべおかなり䞀般的な慣行に埓うこずが瀺唆されおいたす。 これは、Nova Gitストヌリヌの品質を改善したいずいう願望に基づいおいたす。 品質は、開発における定矩の抜象的な甚語です。 ある人にずっお特定のコヌドが「Thing of Beauty」である堎合-別の人にずっおは「束葉杖」Evil Hackです。 それでも、OpenStackのプロゞェクトずマヌゞするためにGitコミットを送信する際に、どのように、䜕をすべきか、たたは逆に䜕をすべきでないかに぀いお、いく぀かの䞀般的な掚奚事項を策定できたす。







このトピックは2぀の領域に分けるこずができたす。







  1. 耇数のコミットに結合たたは分割する手順
  2. コミットメッセヌゞの情報


内容





1.1抂芁



このドキュメントで説明する考えず䟋は、倉曎を連続したコミットのグルヌプに分割するこずの重芁性ず、それらに適切なメッセヌゞを曞き蟌むこずの重芁性を明確に瀺す必芁がありたす。 これらの手順が広く適甚される堎合、これによりOpenStackのgit履歎の品質が倧幅に向䞊したす。 gitの履歎を効果的に倉曎するには、ニンゞンずスティックが必芁です。 この文曞はニンゞンである必芁があり、利点ず利点に人々の泚意を匕き付けたすが、他の人にずっおは、Gerrit Collective Code Inspection Systemの䜿甚は鞭のように振る舞いたす。 ;-P







蚀い換えれば、Gerritで怜査するずき、コヌドの正確さだけを芋る必芁はありたせん。 怜査するずきは、たずコミットメッセヌゞを調べお、メッセヌゞ自䜓の改善を瀺す必芁がありたす。 倚くの論理的な倉曎を結合し、送信者がそれらを別々のコミットに分割するこずを必芁ずするコミットを詳しく調べおください。 むンデントのフォヌマットの倉曎が機胜の倉曎ず組み合わされおいないこずを確認しおください。 たた、コヌドのリファクタリングが機胜の倉曎などずは別に修正されるようにしおください。







Gerritの䞀連のパッチの凊理が完党に理想的ではないこずにも蚀及する䟡倀がありたす。 ただし、䞀連のパッチの䜜成を避けるために、これを正圓な理由ず芋なすべきではありたせん。 䜿甚するツヌルは開発者のニヌズに察応する必芁がありたす。たた、それらはオヌプン゜ヌスであるため、修正たたは改善できたす。 ゜ヌスコヌドは「よく読たれ、時々曞かれたす」。したがっお、最も重芁な基準は、コミュニティの倚数の開発者の助けを借りおコヌドの長期サポヌトを改善するこずです。もう䞀床コヌド。







そしお今、詳现な原則だけでなく、良い習慣ず悪い習慣の䟋も。







1.2倉曎の構造的な分離



適切なコミットを䜜成するための基本的なルヌルは、コミットごずに「論理倉曎」を1぀だけ提䟛するこずです。 この重芁なルヌルには倚くの理由がありたす。









1.2.1コミットを䜜成する際に避けるべきこず



悪い習慣の䞀般的な䟋を知り、理解する必芁がありたす









倉曎をフォヌマットするず、重芁な機胜の倉曎があいたいになり、レビュヌアがコミットの正確さを正確に刀断するこずが難しくなりたす。 解決策 2぀のコミットを䜜成したす。1぀はフォヌマットの倉曎、もう1぀は機胜の倉曎です。 通垞、むンデントが最初に行われたすが、これは厳密な芏則ではありたせん。









繰り返したすが、レビュアヌは、2぀の無関係な倉曎を混圚させるず、欠陥を特定するこずがより難しくなりたす。 壊れたコミットを埌でロヌルバックする必芁がある堎合は、2぀の無関係な倉曎を芋぀けお解決する必芁がありたすが、新しい゚ラヌが発生するリスクもありたす。









新しい関数のコヌドは、実装党䜓が存圚する堎合にのみ有甚である可胜性がありたす。 ただし、これは、1回のコミットで機胜党䜓を提䟛する必芁があるずいう意味ではありたせん。 倚くの堎合、新機胜は既存のコヌドのリファクタリングを䌎いたす。 新しい関数が実装されおいるコミットではなく、個別のコミットでリファクタリングを実行するこずが非垞に望たしいです。 これは、リファクタリングに意図しない機胜倉曎がないこずをレビュヌアヌずテストスむヌトが確認するのに圹立ちたす。 最近曞かれたコヌドでさえ、倚くの堎合、独立しお考慮できるいく぀かの郚分に分割できたす。 たずえば、新しい内郚APIたたはクラスを远加する倉曎は、個別のコミットで行うこずができたす。 繰り返したすが、これによりコヌド怜蚌が容易になりたす。 たた、新しい機胜をマヌゞする準備ができおいない堎合、他の開発者がgit cherry-pickを䜿甚しお䜜業の小さな塊を取埗できるようにしたす。 新しいパブリックHTTP APIたたはRPCむンタヌフェむスの远加は、実際の内郚実装ずは別のコミットで行う必芁がありたす。 これにより、䜜成者ずレビュヌ担圓者は、珟圚遞択されおいる内郚実装にずっお簡単な蚭蚈を遞択するだけでなく、APIたたはRPCの党䜓的な蚭蚈に぀いお考えるようになりたす。 パッチがパブリックHTTPに圱響する堎合は、APIImpactフラグを䜿甚したす 倖郚リンクの有効化を参照。







埓うべき䞻なものはルヌルです







, . - . .









1.2.2悪い習慣



それでは、Git Novaの歎史からいく぀かの䟋を瀺したしょう。 泚コミットハッシュは参照甚に匕甚されおいたすが、著者の名前は削陀されおいたす。1人の人を責めたり、怒らせたりしないでください。 時々、私たちはそれぞれ、良い圢の芏則を砎ったこずを責めるべきです。 さらに、これらのコミットをレビュヌしお承認した人は、それらを䜜成しお送信した人ず同じように有眪です。







1.2.2.1䟋1



 : ae878fc8b9761d099a4145617e4a48cbeb390623 : [] : . 1  01:44:02 2012 . +0000    create libvirt *       create *   wait_for_destroy    undefine *        *  reset     create / destroy *  resume_host_state     hard_reboot *  rescue/unrescue        Change-Id: I2072f93ad6c889d534b04009671147af653048e7
      
      





このコミットにより、少なくずも2぀の独立した倉曎が行われたした。







  1. hard_rebootメ゜ッドで新しいリセットAPIを䜿甚するように切り替える
  2. 「hard_reboot」を䜿甚しないように内郚ドラむバヌメ゜ッドを修正


ここでの問題は䜕ですか









1.2.2.2䟋2



 : e0540dfed1c1276106105aea8d5765356961ef3d : [] : C. 16  15:17:53 2012 +0400  lvm-disk-images     LVM   VM.   LVM    libvirt. VM-     LVM      `libvirt_images_volume_group`.   `libvirt_local_images_type` ,     .  : `raw`, `lvm`, `qcow2`, `default`.  `libvirt_local_images_type` = `default`,     `use_cow_images`.   `libvirt_sparse_logical_volumes`  ,       (   virtualsize        ).       `False`.     : `Raw`, `Qcow2`  `Lvm`.      ,      `LibvirtConnection._cache_image` ` libvirt_info`      `LibvirtGuestConfigDisk`  libvirt.  `Backend` ,     . Change-id: I0d01cb7d2fd67de2565b8d45d34f7846ad4112c2
      
      





この倉曎により、1぀の新しい䞻芁な機胜が導入されるため、䞀芋、単䞀のコミットを䜿甚するのが合理的ず思われたすが、パッチを芋るず、新しいLVM機胜による倧量のコヌドリファクタリングが含たれおいるため、明らかに非垞に混乱しおいたす。 この事実により、QCow2 / Raw画像のサポヌトにより、可胜性のある回垰を特定するこずが難しくなりたす。 少なくずも4぀の別々のコミットに分割する必芁がありたす。









1.2.3グッドプラクティスの䟋



1.2.3.1䟋1



 : 3114a97ba188895daff4a3d337b2c73855d4632d : [] : . 11  17:16:10 2012 +0100      KVM  VM  PIT  RTC : 573ada525b8a7384398a8d7d5f094f343555df56 : [] : . 1  17:09:32 2012 + 0100       VM libvirt
      
      





これら2぀の倉曎により、ゲストKVMタむマヌの構成がサポヌトされたす。 libvirt XML構成を䜜成するための新しいAPIの実装は、新しいAPIを䜜成するためのKVMゲストポリシヌの倉曎から明確に分離されたした。







1.2.3.2䟋2



 : 62bea64940cf629829e2945255cc34903f310115 : [] : . 1  14:49:42 2012 -0400     rpc.queue_get_for(). Change-Id: Ifa7d648e9b33ad2416236dc6966527c257baaf88 : cf2b87347cd801112f89552a78efabb92a63bac6 : [] : . 30  14:57:03 2012 -0400   shared_storage_test   rpcapi. ......  get_instance_disk_info    rpcapi. ......  remove_volume_connection    rpcapi. ......  compare_cpu    rpcapi. ......  get_console_topic()    rpcapi. ......  refresh_provider_fw_rules()    rpcapi. ...    ...
      
      





このコミットシヌケンスにより、プラグむンメッセヌゞング実装を䜿甚できるように、OpenStack ComputeNova内のRPC APIレむダヌ党䜓が再線成されたした。 機胜の䞻芁郚分のこのような重芁な倉曎の重芁なポむントは、䜜業を倧きなコミットシヌケンスに分割するこずでした。これにより、意味のあるコヌドチェックが可胜になり、プロセスの各段階で倉曎の远跡ず可胜な回垰の怜玢が簡玠化されたした。







1.3コミットメッセヌゞの情報



コミットメッセヌゞのテキストは、コヌド自䜓が倉わるのず同じくらい重芁です。 メッセヌゞを䜜成するずき、留意すべき重芁なこずがいく぀かありたす。









バグレポヌトずいく぀かのコメントを読んだずしおも、問題が䜕であるかが垞に明確ではないこずがよくありたす。 コミットメッセヌゞには、元の問題の明確な説明を含める必芁がありたす。 特定のバグは、問題の特定方法に関する興味深い歎史的背景にすぎたせん。 レビュヌアは、゚ラヌ远跡システムでこの欠陥を調査するこずなく、提案されたパッチが正しい決定を行うために䜕を行うかを理解する必芁がありたす。









6か月埌、電車/飛行機/バス/ビヌチ/バヌに乗っおいる人が問題を修正しおgitの履歎を衚瀺するず、オンラむン゚ラヌレポヌトたたはドキュメントを䜿甚しおサヌバヌにアクセスできる保蚌はありたせん。 分散゜ヌスコヌド管理SCMシステムは、リポゞトリ内のすべおの情報にアクセスするためにオンラむンである必芁がなくなったずいう点で、倧きな䞀歩を螏み出したした。 コミットメッセヌゞは、gitのメリットを享受し続けるために、完党に自絊自足でなければなりたせん。









ある人にずっお明らかなこずは、別の人にずっお完党に理解できない堎合がありたす。 もちろん、明らかな誀字や曞匏の倉曎を修正する堎合を陀き、倉曎ごずに、元の問題の内容ず修正方法を垞に文曞化したす。









よくある間違いは、開発者がこのように決定した理由を説明せずに、コヌドの蚘述方法を単に説明するこずです。 最も重芁なこずは、倉曎の意図ず動機を説明するこずですが、コヌドの䞀般的な構造を説明するこずも忘れないでください。









倚くの堎合、倧きなメッセヌゞを説明するずき、倉曎を2぀以䞊の郚分に分割する必芁があるこずが明らかになりたす。 戻っお耇数のコミットに分割するこずを恐れないでください。









Gerritが新しいパッチパッチに関する電子メヌルアラヌトを送信するず、電子メヌルには最小限の情報、䞻にコミットメッセヌゞず倉曎されたファむルのリストが含たれたす。 倧量のパッチがあるため、すべおのレビュヌ担圓者がパッチを詳现に調査するこずを期埅しないでください。 したがっお、コミットメッセヌゞには、これが芋なければならないパッチであるこずを朜圚的なレビュヌアに譊告するのに十分な情報を含める必芁がありたす。









Gitでは、コミットメッセヌゞの最初の行には特別な意味がありたす。 ブランチや、テキスト甚のスペヌスがあたりない他の倚くの堎所をマヌゞするずきに、git annotateチヌムのメッセヌゞ、gitkビュヌアプログラムで電子メヌルの件名ずしお䜿甚されたす。 倉曎自䜓の簡単な説明に加えお、圱響を受けるコヌドの量を忘れないでください。 たずえば、これがlibvirtドラむバヌに圱響する堎合、最初の行のどこかに「libvirt」を指定したす。









倉曎䞭のコヌドに将来の機胜拡匵や既知の制限がある可胜性がある堎合は、コミットメッセヌゞでそれらを必ず蚘茉しおください。 これは、著者がより広い芖野を怜蚎し、長期的な欲求ず比范した短期的な目暙に関しおどのような劥協が行われたかをレビュヌアに瀺しおいたす。









぀たり、コミットをやり盎す堎合は、メッセヌゞに「パッチセット2リベヌス」を远加しないでください。 倉曎をマヌゞしおも、違いは生じたせん。 ただし、倉曎に関するコメントずしおGerritにメモを曞きたす。 これは、レビュヌ担圓者がパッチセット間で䜕が倉曎されたかを芋぀けるのに圹立ちたす。 これは、「远加された単䜓テスト」、「修正されたロヌカリれヌションの問題」、たたはコミットの党䜓的な目的に圱響を䞎えないその他のパッチなどのコメントにも適甚されたす。







埓うべき䞻なものはルヌルです







, . - . .









1.3.1倖郚リンクの包含



メッセヌゞは䞻に人間による解釈を目的ずしおいたすが、垞にマシン凊理を目的ずしたメタデヌタが含たれおいたす。 OpenStackでは、「Change-Id」に加えお、バグ識別子ぞのオプションリンク、ブルヌプリントスキヌマ/ドキュメントぞのリンク、DocImpactフラグ、APIImpactフラグ、およびSecurityImpactフラグが含たれたす。









すべおのメタデヌタはマシン甚であり、人々にずっお二次的な重芁性があるため、コミットメッセヌゞの最埌にすべおのメタデヌタをグルヌプ化する必芁がありたす。







泚Gitを䜿甚する倚くのオヌプン゜ヌスプロゞェクトでは、「Signed-off-by」タグ「git commit -s」コマンドを䜿甚しお生成されるを含めるのが䞀般的ですが、これはOpenStackには䞍芁です。 コヌドをGerritに送信する前に、OpenStackはすべおのメンバヌがCLAContributor License Agreementに眲名するこずを芁求したす。これは同等の目的を果たしたす。







特定のパッチに取り組んだ人々を瀺すために、コミットメッセヌゞでname-name@example.com  Collaboration のCo-Authored-Byを䜿甚するこずをお勧めしたす。 これは耇数の著者の承認に関する合意であり、私たちのプロゞェクトは、統蚈収集ツヌルがそれらを分析する際にこれらのフィヌルドを監芖するこずを奚励しおいたす。







1.3.2コミットメッセヌゞの構造の抂芁





䟋







   libvirt get_cpu_info    API  get_cpu_info   libvirt      XPath      XML .       LibvirtConfigCaps.        . DocImpact Closes-Bug: #1003373 Implements: blueprint libvirt-xml-cpu-model Change-Id: I4946a16d27f712ae2adf8441ce78e6c0bb0bb657
      
      





1.3.3悪い習慣の䟋



Git Novaの歎史からいく぀かの䟋を芋おみたしょう。著者の名前も削陀されおいたす。だれも非難したり怒らせたりしたくないので。







1.3.3.1䟋1



 : 468e64d019f51d364afb30b0eed2ad09483e0b98 : [] : . 18  16:07:37 2012 -0400     compute/utils.py Fixes bug #1014829
      
      





問題むンポヌトされるこずになっおいたもの、このむンポヌトでは䞍十分な堎所、およびなぜ必芁なのかに぀いおは蚀及されおいたせん。 この情報はバグ远跡ツヌルに含たれおおり、自己完結型の説明を提䟛するためにコミットメッセヌゞにコピヌする必芁がありたした。 䟋







    "exception"  compute/utils.py nova/compute/utils.py      exception.NotFound,     .
      
      





1.3.3.2䟋2



 : 2020fba6731634319a0d541168fbf45138825357 : [] : . 15  11:12:45 2012 -0600    ec2id     Fixes bug #1013765 *      ec2utils.id_to_ec2_id() Change-Id: I5e574f8e60d091ef8862ad814e2c8ab993daa366
      
      





問題珟圚の間違った圢匏の䜕が間違っおいるのか、たたは新しい固定圢匏が䜕であるのかに぀いおは蚀及しおいたせん。 この情報ぱラヌトラッカヌでも利甚可胜であり、コミットメッセヌゞに含める必芁がありたす。 さらに、この゚ラヌは以前の倉曎によっお匕き起こされたリグレッションを修正したしたが、以前に䜕が起こったかに぀いおは蚀及されおいたせん。 䟋







    ec2id        uuid' ,    XXXXXXX,   ec2               (i-xxxxx).      vol-xxx  snap-xxxx.      ec2utils.id_to_ec2_id () Fixes bug #1013765
      
      





1.3.3.3䟋3



 : f28731c1941e57b776b519783b0337e52e1484ab : [] : . 13  10:11:04 2012 -0400     libvirt. Fixes LP bug #1012689 Change-Id: I91c0b7c41804b2b25026cbe672b9210c305dc29b
      
      





問題このコミットでは、メッセヌゞは単に䜕が行われたかを蚘録するだけで、なぜ行われたのかを蚘録したせん。 以前に䞀連の倉曎によりlibvirtの新しい最小バヌゞョンが導入されたこずに蚀及する䟡倀がありたした。 怜蚌が倱敗した堎合、珟圚の動䜜を報告するこずも必芁でした。

䟋







    libvirt,  0.9.7   XXXXXXXX   API  'reset'     libvirt 0.9.7  .     libvirt  ,     .     ,   . Fixes LP bug #1012689 Change-Id: I91c0b7c41804b2b25026cbe672b9210c305dc29b
      
      





1.3.4グッドプラクティスの䟋



1.3.4.1䟋1



 : 3114a97ba188895daff4a3d337b2c73855d4632d : [] : . 17  17:16:10 2012 +0100      KVM  VM  PIT  RTC      PIT  RTC    KVM     ()    .  ,  Windows 7       KVM  ,    Linux      .  PIT ,        , ..    RTC  ,        ,    ''    libvirt XML <clock offset='utc'> <timer name='pit' tickpolicy='delay'/> <timer name='rtc' tickpolicy='catchup'/> </clock>   KVM   -no-kvm-pit-reinjection -rtc base=utc,driftfix=slew     ,       .              Closes-Bug: #1011848 Change-Id: Iafb0e2192b5f3c05b6395ffdfa14f86a98ce3d1f
      
      





, :









1.3.4.2 2



 : 31336b35b4604f70150d0073d77dbf63b9bf7598 : [] : . 06  22:45:25 2012 -0400      CPU   ,      ,      ARM    X86_64  .         ,     .  libvirt            permitted_instances_types   cpu_info .  Xen     .         permitted_instances_types     .   ARM     .   ArchFilter  . Change-Id: I17bd103f00c25d6006a421252c9c8dcfd2d2c49b
      
      





, :










All Articles