web-dev-qa-db-ja.com

プロジェクトでソース管理を使用する最良の方法(1〜3人)

私のパートナーと私はプラクティス管理システムに取り組んでおり、最初はバージョン管理を使用していませんでしたが、私はgitを使用するように彼を説得しました。現在のところ、システムには、開発、マスター、リリースの3つのブランチがあります。私たちのgitリポジトリは、Apache、MySQLなどの外部サーバー上にあります。開発ブランチ(コミット)で毎日のコーディングを行った後、(半)バグがないことを確認するためにいくつかのテストを行いました。マスターブランチに。急進的なことをしたい場合は、masterのブランチを作成し、混乱させます。うまくいった場合は、マージして戻し、そうでない場合はブランチを削除します。

最後に、毎週のリリースに行くとき、リリースブランチにマージして、リリースしたときと同じようにプロジェクトのコピーがあることを確認します。残念ながら、gitの速度が遅くなりすぎるため、すべてのファイルをgitで追跡しません(たとえば、これは特に、シングルコア1.4 GHz AMD Sempronを搭載した古いサーバー上にあるため)、git status通常、約3秒から約1分に変化します。または、できない(mysqlデータベース)。私たちにとってスローダウンは機能しないので省略します。画像を削除していないので問題になることはありませんが、最適化を開始するとすぐに問題が発生する可能性があります。したがって、以前のコミットをチェックアウトすると、ファイルが存在しないことがあり、ファイルが破損します(大きな問題は、データベースでバージョン管理を使用できないためです(方法がわからないため)。スキーマが変更されているためです。戻ると壊れます)。

そして、それはほとんど私たちのワークフローです。

だから私の背景の後に、私の質問は次のとおりです:上記に加えることができる改善があると思いますか?

そして補足:gitでmysqlデータベースを追跡する信頼できる簡単な中程度の難しさ(つまり、too難しい)方法を知っている人はいますか?

7
Fred

GitやMercurial(bitbucketが使用するもの)のような分散SCMを使用しても、分岐は可能ですが、多くの場合不要です。あなたが代わりに行うことは(基本的なワークフロー)です:

  • すべての開発者がアクセスできる場所にリポジトリを設定します(ネットワーク共有、sshを実行できるサーバー、githubやbitbucketなどのサードパーティサービス)。これは、信頼できるリポジトリになります。
  • このリポジトリを各開発者のマシンに複製し、適切な開発環境を作成するために必要なことをすべて実行します。
  • ローカルコピーで作業します。いつでもコミットします。コミットはローカルであるため、誰かを傷つけることはありません。ローカルコピーが同期されないように、時々中央リポジトリからプルするようにしてください。
  • 制作の準備が整っていると思われるものがあれば、ローカルクローンから中央リポジトリにpushします。
  • セントラルリポジトリでは、リリース候補としてマークしたいバージョンがある場合は、タグを付けます。このようにして、任意のクローンを後でその正確なバージョンに更新できます。

分散SCMではリポジトリへのクローンを無制限に許可し、各クローンをマスターとして使用できるため、このベースからより複雑なワークフローを構築できます。たとえば、開発用、QA用、本番用など、いくつかの中央リポジトリを持つことができます。ビルドサーバー専用のクローンを使用できます。ローカルで複数のクローンを使用できます。分岐する代わりに、別のクローンを作成するだけで、うまくいかない場合は単に削除します。

もう1つの素晴らしい利点は、中央リポジトリが修復できない場合でも、いくつかのコピーが残っていることです。あなたがする必要があるのは、1つの開発者のリポジトリを中央サーバーにクローンして戻すだけです。すべては良好です(ただし、中央サーバーでコミットされていない変更は失われませんが、とにかく誰もそこに直接変更を加えないようにしてください。皆が最新の変更をもう一度プッシュするために)。

データベースの追跡は困難です。通常、データではなく構造を追跡する必要があります。データは大幅に変更され、コードにはあまり関係がなく、そのようにアクセス可能にしない方がよい機密情報が含まれる場合があります。一般的なアプローチは、データベースを現在の形式でセットアップするスクリプトを作成することです。おそらく、典型的なテストデータを入力するスクリプトを作成することもできます。または、増分変更スクリプトを追跡します。1日目に設計されたとおりにデータベースを作成するスクリプトが1つあります。次に、適切な場合は、最終的に最新の状態になるまでデータベースを変更する一連のスクリプトがあります。物事の状態。ただし、これらはコードの変更を追跡するよりも信頼性が低く、手動での作業が多くなるため、本番データベースの適切なバックアップ/復元計画が必要になります。

14
tdammers

Gitに関する懸念は十分にカバーされていると思います。私が見たデータベースにとって最高のVCは DB Ghost 、または少なくともその概念です。私たちはそれをDBのVCにも、できれば自由な方法で適応させるようにしています。

2
Nic

mysqldump を使用して、gitのデータベースの状態を追跡できます。 プロジェクトが使用するすべてのもの(画像やその他のバイナリデータ)を除外しないでください(* .pycなどのコンパイル済みファイル以外)。システムリソースに問題がある場合は、gitではなくbitbucketの使用を検討してください。あなたは無料で無制限のプライベートな小さなプロジェクトをホストすることができます(私は信じています<= 5開発者).

別のメモでは、私はまれにもうブランチを使用している人を見る(それはsooooです) SVN;))。たいていの人は、チップから作業をして、自分が持っているものに満足するたびにタグを付けます。

1
Demian Brecht

データベースの変更の追跡に関する同様の経験では、データベースの構造を処理するだけです。 NHibernateのようなORMを使用すると、HBMマッピングを気にすることができます。そうしないと、データベース構造スクリプトを常に維持できます。

0
Afshar Mohebbi

私はダンマーの答えが本当に好きです!

追加することの1つは次のとおりです。

画像などの追跡されるファイルが多すぎるという問題に対処するために、それらのディレクトリを.gitignoreに追加して、個別に処理することができます。ただし、これは優れたソリューションではありません。マシンのパワーが問題だと思われる場合は、より強力なマシンを購入する方が良いでしょう。そのコストの計算では、常にあなたの時間Xあなたの時給を考慮してください。

0
junky

データベーススキーマを単純な形式で出力する単純なphpスクリプト(私はdbschema.phpと呼びます)を次に示します。

次のように実行します:./dbschema db name db user db pass > schema.txt

次に、出力schema.txtをバージョン管理下に置くと、解決策があります。

スキーマを変更するたびに、スクリプトを再実行してください。

コードは次のとおりです。

#!/usr/bin/php -q
<?
if (!isset($_SERVER["argv"][1])) die("ERROR: Need arguments\n");
if (!isset($_SERVER["argv"][3])) die("ERROR: Too few arguments\n");
$db_name=$_SERVER["argv"][1];
$db_user = $_SERVER["argv"][2];
$db_pass = $_SERVER["argv"][3];
mysql_connect('localhost', $db_user, $db_pass) or die ("ERROR: Could not connect to the database server\n"); 
$use_query="Use $db_name";
$use_result=mysql_query($use_query) or die("Error using " . $db_name . " | " . mysql_error());

// show the tables of the currently selected database    
$table_query="show tables";
$table_result=mysql_query($table_query) or die("ERROR: Error getting a list of tables from " . $db_name . " | " . mysql_error());
while($table_row=mysql_fetch_row($table_result))
{
    $table_name=$table_row[0];
    echo "\n"."TABLE NAME " . $table_name . "\n";
    // now describe the selected table
    $field_query="describe $table_name";
    $field_result=mysql_query($field_query) or die("Error describing the table " . $table_name . " | " . mysql_error());
    while($field_row=mysql_fetch_row($field_result))
    {
        if (strlen($field_row[0]) >= 16){ $tab = "\t";}
        elseif (strlen($field_row[0]) >= 8){ $tab = "\t\t";}
        else{ $tab = "\t\t\t";}
        echo "$field_row[0]". $tab .$field_row[1]. "\n";
        }
}
?>
0
Rory