web-dev-qa-db-ja.com

再フォーマットとバージョン管理

コードのフォーマットが重要です。でも インデントが重要 。そして、一貫性はマイナーな改善よりも重要です。しかし、プロジェクトには通常、明確で完全な検証可能および強制スタイルガイドが1日目から含まれておらず、大きな改善が実現する可能性があります。いつでも。多分あなたはそれを見つける

SELECT id, name, address
FROM persons JOIN addresses ON persons.id = addresses.person_id;

/よりも適切に記述できる

SELECT persons.id,
       persons.name,
       addresses.address
  FROM persons
  JOIN addresses ON persons.id = addresses.person_id;

クエリに列を追加する作業をしています。たぶん、これはコード内の4つすべてのクエリの中で最も複雑なものかもしれませんし、数千のなかで取るに足らないクエリかもしれません。移行がどれほど困難であっても、その価値があると判断します。しかし、主要な書式変更全体のコード変更をどのように追跡しますか?あきらめて、「ここからやり直すところです」と言うか、またはリポジトリ履歴全体のすべてのクエリを再フォーマットできます。

Gitのような分散バージョン管理システムを使用している場合は、最初のコミットに戻し、そこから現在の状態に再フォーマットできます。しかし、それは多くの作業であり、それが進行している間、他の誰もが作業を一時停止する(またはすべてのマージの母のために準備する)必要があります。 履歴を変更するより良い方法はありますかこれはすべての結果の中で最良のものを提供します:

  • すべてのコミットで同じスタイル
  • 最小限のマージ作業

明確にするために、これはプロジェクトの開始時のベストプラクティスではなく、大規模なリファクタリングがGood Thing™であると見なされたが、追跡可能な履歴が必要な場合に何をすべきかバージョンが常に同じように動作することを保証する唯一の方法である場合は、履歴を書き換えないことは素晴らしいことですが、クリーンな書き換えの開発者の利点はどうですか?特に、書き換えられたバージョンが元のバージョンとまったく同じように機能することを保証する方法(テスト、構文定義、またはコンパイル後の同一のバイナリ)がある場合はどうでしょうか。

24
l0b0

個別のコミットとして再フォーマットを行います。これにより、履歴への干渉が最小限に抑えられ、どのコミットが単に再フォーマットされ、実際にコードが変更されているかが一目でわかります。歪む可能性がありますgit blameと同様ですが、再フォーマットのみのコミットを指している場合、その前の以前の変更を探すのはかなり簡単です。

26
harald

VCS履歴を書き換えない: it; s VCSの原則に反します。

フォーマットの修正を自動化しようとしないでください:それは症状を処理しており、実際の問題ではありません(=開発者がコーディング標準に従っていない)。

共通のドキュメントでコーディング標準とフォーマットのベストプラクティスを定義し、すべての開発者に同意してもらいます。

配布されているので素晴らしいGitについて言及します。 DVCSを使用すると、ゲートキーパーワークフローを通じてベストプラクティスを適用するのが非常に簡単です。ゲートキーパー拒否共通のガイドラインに準拠していない提案をマージ(= Gitのプルリクエスト)。そして、私はrejectを太字で意味します。そうしないと、違反しているコーダーがルールを守り、同じ間違いを繰り返し続けることはありません。

このテクニックは私にはうまくいきます。コーダーは自分の作業をマージしたいと考えているため、最初にいくつかのミスを犯した後、ルールに従っています。

既存のコードベースを修正するごとに...モジュールごとに、またはプロジェクトにとって意味のある方法で、徐々に実行することをお勧めします。各ステップで慎重にテストします。馬鹿げているように聞こえるかもしれませんが、書式設定のような些細な変更でも間違いが発生するので、道路上のいくつかの小さなバンプに備えてください。

13
janos

あなたの実際の質問に対する答えは、「あなたはしません」です。ある方法でフォーマットされたコードから、主要なフォーマット変更、およびコードが新しい方法でフォーマットされた後の変更まで、ロジックの変更を追跡できる現在のSCMツールは知りません。そして、あなたはこれを知っています、コードの一部の履歴を失うことは良くありません。

したがって、最初の文とは少し矛盾します。コードのフォーマットは重要ではありませんthat多く。プリティはニースですが、ここではそうではありません。誰かの古い地獄の奇妙なK&Rバリアントコードに2スペースのインデント(1)が含まれていることを理解している人もいるのですが、... 例外的に病的。そしてその場合、とにかくコードを変更する際に問題が発生するので、気にする必要はありません。

したがって、確立されたコードを厳密に変更して再フォーマットすることは価値がありません。変数名の変更、長い関数の分割、内容を変更するすべての優れたリファクタリング、そうですが、再フォーマットするだけではありません。

1)-Windowsクリップボードビューアーをしばらく所有していました。全体は1つの150k Cモジュールでした。さまざまな人が30行以内で5つの異なるブレーススタイルを使用していた場所を見つけました。しかし、その部分はうまくいきました。私はそのコードのチャンクのプリントアウトを10年間持ち歩いていましたが、その歴史が重要であり、そのコードはすべてが生きていた少なくとも3つのソースツリー(Windows 3.x、NT、future 95)にあったため、ポークしませんでした別の建物で。

10
mjfgates

しかし、どのようにして主要なフォーマット変更全体のコード変更を追跡しますか?

フォーマットの変更areコードの変更;コードに対する他の変更と同様にそれらを扱います。重要なプロジェクトに取り組んだことのある人なら誰でも、誰かがコードを「ただ」再フォーマットすることを決めたときに作成されたバグやその他の問題を見たことがあるでしょう。

しかし、それは多くの作業であり、それが進行している間、他の誰もが作業を一時停止する(またはすべてのマージの母の準備をする)必要があります。

すべてを同時に再フォーマットする必要があるのはなぜですか?特に、再フォーマットしてもコードの意味が変わらない場合は、ファイルを個別に再フォーマットして、作業を進めながらチェックインできるはずです。チームの全員にスタイルに同意してもらいます(そうしないと、とにかく再フォーマットしても意味がありません)。他の作業の過程で、全員に再フォーマットの面倒を見てもらいます。しばらくすると、残りのプロジェクトを中断することなく、ほとんどのコードをカバーすることができます。

4
Caleb

これについて私が見た実行可能な2つのアプローチがあります。

1。 commit-hookでコードを再フォーマットする

コードを送信した後、最初はコードを変更するのは面倒ですが、再フォーマット手順(例: astyle )がコードに悪影響を与えない場合は、安全な操作です。時間が経つにつれ、チーム全体が最終的にすべてのコードが同じに見えることを高く評価します。明らかに、包括的なユニット/自動テストを行うことで、何も壊れないことが保証されます。

2。すべてのコードの1回限りの再フォーマット

これは私の経験ではより危険であり、ビッグバン全体で問題を追跡することを困難にしますが、それは可能です。その後、すべてのテストを実行することが不可欠です。コーディングスタイルの場合、違いの大部分は空白の使用(インデントまたは改行)に関係しています。まともなマージツールは、すべての空白の違いを無視するように指示できるはずです。そのため、これはマージに役立ちます。

1
JBRWilkinson