一時的なコードはバージョン管理下に置くべきですか?


29

一時/ローカルコードの例を次に示します。コードベースを操作するために必要ですが、その一部であると有害です:

  1. プロジェクトファイル。現在のPCのレイアウトを反映するために、パスを編集する必要がある場合があります。
  2. メイクファイル。たとえば、デバッグ中は最適化をオフにする必要がありますが、CIサーバーはオフにする必要はありません。
  3. 汚いいハッキング。たとえばreturn 7、関数に応じて、関数に応じて何かをテストするために、値7で破損する疑いがある場合、または7はまだ実装されていないボタンのコードです。私のブランチの人生。

リポジトリにプッシュしてからプッシュする前に、常にトップにリベースするgitコミットにそれらを保持しようとしましたHEAD~。これは非常に不便であり、svnでは機能しません。スタッシングは私をさらに怖がらせます-「押した後にポップするのを覚えていましたか??」。

コードをバージョン管理から外すと、コミットがアセンブルされるたびに不快なノイズが発生し、金曜日の夕方に誤ってコミットに導入される可能性があります。

このような使い捨てのコードの正解は何でしょうか?


この一時的なコードは、一時的な使用期間中に元のプロジェクトから更新する必要がありますか?
ジェフ14

@JeffO、私があなたを理解しているかどうかわからない。汚いスニペットは小さく、開発中のコードと衝突することはめったにありません。しかし、@ Blrfl、彼らがメインストリームにコミットされることは非常に危険です。夏の暑さの中、お粗末な合併があっreturn 7trunk金曜日の夜を想像してください。
ヴォラック14

@Vorac-コードレビューとテストの目的です!私はそれよりもはるかに悪いことを示すことができます-一見良いように見えても動作しないコード。Return 7..それらがすべて明白だった場合のみ!
gbjbaanb 14

@Vorac:それは何よりも哲学的なコメントでした。
Blrfl 14

2
どんな環境にいるのかを知る方法はありますか?たとえば、dev環境にいるがval / prodではないことが検出された場合にコードを実行するように設定できます。そうすれば、コミット時にプレースホルダーコードを常に追加/削除する必要がありません。
サッジョ14

回答:


46

すべてのコードは一時的なものです。変更を行うときは、時々プレースホルダーを紹介します-デザイナーからの実際のアイコンを待って描いたアイコン、私が知っている関数は、同僚が書いていてまだ終了していない(または開始していない)ライブラリを呼び出します削除されるか、条件付きにされる追加のログ、テストチームが気づいたら修正に取りかかるバグなど

すべてをチェックインします。すべての開発に機能ブランチを使用すると、最終バージョンをトランクにマージできます。開発サイクル中に作成したハックやボッジ、修正を誰も知る必要はありません。最終バージョンを参照してください。しかし、定期的にブランチにコミットしている場合は、1日がめちゃくちゃうまくいかなかった場合や、パブで昼食をとった後もコーディングを続けた場合に保持する価値のあるものを見ることができます。

バージョン管理は、アーティファクトリポジトリまたはドキュメントストレージシステムではありません。変更の履歴を保持することについて。いつかあなたがそれが何であったかを見たいかもしれないので、そこにあなたが好きなものをすべて貼り付けてください、そして、それらはあなたのSCMが本当に何であるかを理解する日です。

PS。本当に一時的なファイル(例:.objまたはビルドアーティファクト)は、SCMに場所がありません。これらは誰にとっても価値のないものです。あなたはそれらが何であるかを知ることができます-それらを削除しても気にしないか、それらがなくなっていることに気づきさえします。


5
同意した。分岐は進むべき道です。ブランチを作成し、必要な操作を行い、完成したコードをマージします。ヘッドは、クライアントがいつでもダウンロードして使用できるリリースバージョンとして扱う必要があります。
キャメロンマッケイ14

私が見たものからの素晴らしい答えは、GITはローカル作業のログを持ちたい人々を助けるためにローカルバージョン管理を部分的に導入しました。一時コードは、リポジトリにコミットする準備ができるまで、開発者のマシンにとどまる必要があります
InformedA 14

2
「すべてのコードは一時的です」という大きなポスターを印刷して、壁に貼り付けます。おそらくコミックサンズで。
ボブツウェイ14

2
Clippyの唇から来たバブル引用の@MattThrower?
gbjbaanb 14

1
ただし、実行されていないコードまたはコンパイルされないコードは、バージョン管理にコミットしないでください。
Tulainsコルドバ

17

プロジェクトファイル。現在のPCのレイアウトを反映するために、パスを編集する必要がある場合があります。

プロジェクトファイルの場合、最良の戦略は、スクリプトを介してプロジェクトファイルを生成できる場合です。実際のプロジェクトファイルを無視に追加し、必要に応じてプロジェクトファイルを再生成します。たとえば、Javaプロジェクトでは、Eclipseプロジェクトを生成できるgradleを使用します。

メイクファイル。たとえば、デバッグ中は最適化をオフにする必要がありますが、CIサーバーはオフにする必要はありません。

Makefileを変更せずに、最適化モードとデバッグモードを切り替えることができるはずです。代わりに、コマンドラインフラグ、環境変数、またはリポジトリにない別のファイルを使用して、それを制御します。

汚いいハッキング。たとえば、関数に応じて何かをテストするために、関数の途中で7を返します。値7で破損する可能性があります。または、7は実装されていないボタンのコードです。私のブランチの生涯を通してテストします。

障害の疑いのあるケースを誘発するテストを作成できませんか?

ほとんどの場合、リポジトリ内のファイルにこれらの変更を加えないように、ワークフローを調整できる必要があります。ローカルで変更されるファイルは、プロジェクトの無視メカニズムに追加する必要があり、リポジトリにはありません。場合によっては、まだリポジトリに入れたくない一時的な変更を行うことがあります。それらのために、XXXのような特別なシーケンスを追加し、そこにまだあるコミットを拒否する事前コミットフックを追加します。


時々、同じファイルに実動コードを書いている間に、ファイルに小さなハックをする必要があります。svnファイルの部分的なコミットをサポートしていないため、このような状況では苦痛です。私の同僚のほとんどはハックをブランチにコミットし、マージでそれらをパージしますtrunk。しかし、私は気が散ります(そしてマージ中にミスを犯し、svnのマージは神聖で不変です)ので、この質問は簡単です。
ヴォラック14

@Vorac、コミット時にスクリプトを実行できるSubversionフックを調べます。XXXまたはそれに似たものが含まれている場合、マージを拒否するスクリプトを作成できるはずです。
ウィンストンユワート14

1
@Vorac:TortoiseSVNを使用している場合、ファイルで[コミット後の復元]を使用して部分的にコミットし、差分ツールまたはエディターを使用して、コミットしたくないブロックを一時的に削除してからコミットできます。Tortoiseはすぐにファイル全体を復元し、準備ができていれば残りのブロックをコミットできます。これは、ファイルのクイックバックアップを作成し、最初のコミット後に復元することで実行できます。
leokhorn 14

5

バージョン管理には、アプリケーションのビルドに必要なコードと構成が含まれている必要があります。

この意味は:

  • 短期間に導入された一時的なもの(バグの場所を特定するため、または言語の機能を試すために必要な時間など)は、バージョン管理に入れないでください。必要になるまで保管してくださいそれから、commitを実行するときに単に削除します。

  • 特定のマシンに適切なローカルファイルは、ブランチに保持される場合があります。

    ラップトップが盗まれたり、ウイルスによってOSを再インストールする必要がある場合、これらすべてをやり直すのは非常に苦痛なので(そして、ところで、最後のバックアップは2年前に行われたことがわかります) 。

    一方、ファイル構造には注意してください。圧倒的になるまでlocal configはOKであり、プロジェクトに参加している42人の開発者全員のすべてのファイルで1つの変更を強制します。

    マシン間の特性を削除する機会に注意してください。以下を意味する場合があります。

    • 開発者のマシン上のローカルインスタンスを置き換えるために、dev SQLサーバーへのアクセスを許可します。

    • Pypinpmなどのパッケージ配布サービスをパブリックパッケージに使用し、プライベートパッケージを社内パッケージに使用すると、

    • チームのメンバーに同じバージョンのソフトウェアをインストールするよう依頼し、

    • ソフトウェアの更新を可能な限り透過的に行い、

    • または、ワンクリックでOSと必要なソフトウェアをマシンに展開できるようにします(さらに、すべての開発者が好みのVim対Emacs、Chrome対Firefoxなどをインストールする時間)

そう:

プロジェクトファイル。現在のPCのレイアウトを反映するために、パスを編集する必要がある場合があります。

すべてのPCで同じレイアウトを使用しないのはなぜですか?プロジェクト内のパスは、プロジェクトファイルに相対的である必要があります。つまり、プロジェクトの場所は問題ではありません。ソフトウェアとライブラリのバージョンは、一部のマシンでのみ表示される不可解なバグを回避するために同じである方がよく、チームの他のメンバーのために再現することは不可能です。

例:

Visual Studioで作成されたプロジェクトには、次のものがあります。

  • ファイル自体。パスは相対的であり、私のマシン上でプロジェクトが存在するかどうかは関係ありませんH:\Development\Hello World Project\が、チームの他のメンバーはプロジェクトをチェックアウトしC:\Work\HelloWorld\ます。

  • 依存関係、つまりサードパーティおよび社内のライブラリ。どちらのタイプもNuGetで処理する必要があります。これにより、すべての競合関連の議論が廃止されます。私が持っているライブラリと同じバージョンを持っていない場合は、NuGetに依存関係を更新するよう依頼してください。それと同じくらい簡単です(うまく機能する場合、常にそうであるとは限りません)。

    社内ライブラリをプライベートNuGetに保持することも重要です。多数のライブラリを共有フォルダーに保存したり、チーム間で電子メールで送信したりすると、無秩序で憂鬱なCIサーバーにつながります。

  • 設定。チームが同じ設定を共有することが重要です。チームの半分が警告をエラーとして扱い、チームの半分が警告をそのまま保持することにした場合、チームの最初の部分のメンバーは、チームの2番目の部分から開発者が生成した警告を削除することに時間を費やします。

  • ユーティリティ関連の設定。チームの一部のメンバーがいくつかのユーティリティをインストールしている場合とそうでない場合があるため、これらは注意が必要です。

    同じツールセットをインストールすることを強くお勧めします。一部のプログラマがStyleCopを使用したいが、他のプログラマは使用しない場合、チームは仕事を完了できません。コード契約を使用するものと使用しないものがある場合、同じ問題が発生します。

メイクファイル。たとえば、デバッグ中は最適化をオフにする必要がありますが、CIサーバーはオフにする必要はありません。

バージョン管理でいくつかのメイクファイルを保持します。CIサーバーでデバッグバージョンをビルドし、それをクライアントにプッシュして、厄介なバグが発生することも珍しくありません。

汚いいハッキング。たとえば、関数に応じて何かをテストするために、関数の途中で7を返し、値7でブレークする疑いがあります。

私はそもそもそのようなコードを避けるでしょう。何かをテストするには、単体テストを使用します。デバッグのためにコードを入れ替えるのに本当に数秒かかる場合、それを行いますが、とにかく数分でこのコードを削除するので、コミットする必要はありません。

それを説明するとき、テストを書く必要があります。たとえば、次のことを確認したい場合:

class TemperatureConverter
{
    public int CelsiusToFahrenheit(int temperature)
    {
        ...
    }
}

定数にtemperature劣ると例外をスローAbsoluteZeroします。コード自体で遊んではいけません。代わりに、次のことを行うユニットテストを作成します。

  • コードを自己文書化する、
  • コードの信頼性を高め、
  • 上記の方法を変更するとき、メンテナーが回帰テストに依存できることを確認します。
  • 同じテストを行う必要のあるチームの他の開発者にサービスを提供します。

2
残念ながら、テストを書く経験はありません。現在のプラットフォームには、USBコマンドに応じてハードウェアを構成するARM CPUが含まれます。ハードウェアからCPUへのフィードバックはありません。
ヴォラック14

2
一時的なコードに永続的な効果がある場合、それらの効果が達成された後はコードが不要になる可能性がありますが、効果が正しく達成されたかどうかの質問がある場合、コードをどこかに保管するのが賢明だと思います。たとえば、開発中に製品のデータベース形式が変更された場合、形式を変更するための簡単な一時ユーティリティを作成できます。古い形式の既存のデータベースのみが変換された後は、ユーティリティが必要になることはありませんが、それでも変換がどのように行われたかを調べる必要があります。
supercat 14

Visual Studioプロジェクトファイルについては、CMakeを使用してファイルを生成した経験が豊富です。これにより、ソースコードとコンパイルされたコードがファイルシステムにどのように配置されているかについてある程度の柔軟性が得られます。次に、VSプロジェクトファイルの代わりにCMake入力ファイルをバージョン管理します。ただし、これは、「バージョン管理には、アプリケーションのビルドに必要なコードと構成を含める必要があります」という原則に準拠しています。私はそれに完全に同意します!
デビッドK 14

Win64のへのアップグレードやサードパーティのプラットフォーム用のライブラリを持つから移動するときに、より逮捕参照を持ついくつかの問題よりにVSでは、あなたは時々あなたがでこっそり絶対パスを持たないようにするために世話をする必要があるIました走った。C:\Program Files\...C:\Program Files (x86)\...
ダンニーリー

@DanNeely:そのため、サードパーティのライブラリはNuGetで処理する必要があります。
Arseni Mourzenko

2

@@コード内のコメントを使用して、準備が整っていないものやテスト目的などを示します。

こうすればコミットでき、同僚は同期するのに長く待つ必要がなく、まだ進行中の作業がどこにあるかを確認できます(たとえば、一部がまだ完全に機能していない理由を理解できます)。

@@ベータテストなどの最終段階に入る前に、「残り物」を防ぐためにグローバルな検索を行います。

その規律を使用して、私はコミットするだけの理由はありません。この方法では、別個のブランチはなく、あとに続く「プロトコル」は1つだけです。


追加の利点として、これらのToDo(通常は小さなもの)は常にコード内にあります。それらに取り組んでいる開発者はすぐにそれらを調べることができ、別々のリストを保持する必要はありません。
開発がどのように行われるかは知っています。あなたは1か所で作業していますが、常に自分の心をスタックとして使用しています(「ここで作業を終えたら、そこを変更する必要があります」)。簡単なコメントを書き留めるだけで@@、スタックオーバーフローが防止されます。

@@name「名前」で話し合う必要がある問題を示すために使用します。


1

2つのハムスターソリューション:

  • pre-commitフックを使用して、コードにHAMSTERなどの異常なキーワードがないか確認できます。ハムスター化されたコードを他人にコミットさせないでください。また、ダーティハックを行うたびにそれを使用してください。

  • たとえばCの別のオプションは、#ifdef HAMSTERを使用することです。コードは、コンパイラフラグHAMSTERがあるマシンでのみ実行されます。


0

現在のバイナリをビルドおよびテストするために必要なすべてをソース管理下に置き物事がそのように設計/実装/テストされた理由を理解します。

あなたが説明したようなスパイクhttp://www.extremeprogramming.org/rules/spike.htmlにも当てはまります。別のサブツリーでホストするだけです。


0

以下は、さまざまな状況で私がときどき使用するいくつかのソリューションであり、自分のワークフローに適用するときに役立つと思われるものです。

  1. 押しつぶせる軽量の枝。

    Gitはこれが素晴らしいです。ブランチをハックし、たくさんのコミットを行い、履歴をリベースまたはスカッシュしてノイズを編集します。

  2. SCMの上にパッチキューを使用します。

    StGitを使用して、現在のブランチの最上部にパッチをフロートさせることがよくあります。ブランチの処理が完了したら、マージ、スカッシュ、またはリベースの前にスタックからポップバックするか、保持したい場合はメインコードベースにマージできます。

  3. 小規模な実験では、RCSを「帯域外」SCMとして使用します。

    場合によっては、後で履歴をクリーンアップすることなく、使い捨ての方法で進行中のファイルをチェックポイントしたいだけです。私は通常、GitまたはSVNの内部でこれにRCSを使用します。GitにRCSアーティファクトを無視し、RCSで進行中の作業をチェックポイントし、結果が気に入ったら、*,vファイルまたはRCSディレクトリ全体を投げるだけです。git clean -fdx「実際の」SCMに作業をコミットするか、後悔するまでは実行しないでください。

  4. 名前付きスタッシュ。

    別のGit-ismですが、便利です:git stash save --include-untracked <some-cool-title>ピンチで役立ちます。この方法で進行中の作業を保存、ポップ、および適用し、git stash listまたはを使用してさまざまなチェックポイントを表示できますgit reflog --all。他のSCMも同様の機能を備えている場合がありますが、これによって走行距離が大きく異なる場合があります。


0

その一時的なコードの一部は、実際には不適切なビルド/テスト/開発方法論の現れであり、それらの存在が将来の改善の動機付けになることを願っています。

少なくともgitでは、機能ブランチをマスター/トランクにマージする準備ができるまで、いくつでも機能ブランチを自由にいじることができます。

バージョン管理はあなたを助けるはずであり、多くの場合、過去にミス(または単に直感的ではない決定)が行われた方法からの洞察に感謝し、現在のより多くの情報に基づいた決定を下します。


0

一部のシステムでは、コメントにTODOが表示されると警告が表示されると考えています。

// TODO: remove this hack.

開発環境の一部で関連するオプションを見つけたり、ビルドファイルにある種のgrepコマンドを貼り付けたりすることができる場合は、それだけで十分かもしれません。また// HACK、ピックアップするための任意の文字列を配置することも可能です。

これは、特定の方法でコードを整理し、人々がそれを使用しないことを覚えていることを期待するよりも簡単です。また、@ gbjbaanbのアドバイスに従うことがより安全になります(すべての人に警告が表示されていることを確認できる場合)。

いつかあなたがそれが何であったかを見たいかもしれないので、そこにあなたが好きなものをすべて貼り付けてください、そして、それらはあなたのSCMが本当に何であるかを理解する日です。


0

コードをソース管理に配置することは決して有害ではありません。

言及する項目はすべて、ソース管理内にある必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.