27

バージョン管理に Git を使用する大規模な Scala プロジェクトに取り組んでいます。私のワークフローは、自分のブランチで新機能に取り組み、必要に応じて切り替えることです。コードのさまざまなリリースは、独自のブランチにあります。すべて非常に標準的です。

コードの特定のバージョンのバグを修正する必要がある場合は、正しいブランチに切り替えてバグを修正し、コミットしてから元の場所に戻します。

問題は、git はすぐに別のブランチに切り替えることができますが、コードを再コンパイルする必要があることです。これには数分かかります。次に、バグを修正し、自分のブランチに戻り、もう一度再コンパイルします。これにはさらに数分かかります。Git が非常に高速であるという目的を無効にしているようです。

他の誰かがこれに遭遇しましたか?それを回避する方法はありますか。これは Scala 固有の問題ではないと確信しています (ただし、Scala はコンパイルが非常に遅いですが)。

3年以上後に更新

ここ数年、@djs answer (git-new-workdir) を使用しています。それは私にとって非常にうまくいきました。私はマスター ディレクトリといくつかの他のディレクトリ (運用、次のリリースなど) を持っており、そこで作業を行う必要があるときに切り替えます。オーバーヘッドはほとんどなく、本番環境にすばやく切り替えて、何かをテストしてから、元の作業に戻ることができます。

7年以上後に更新

git-worktreeが git-new-workdir の代わりになるようです。使用するには:

cd ~/git/my-repo
git worktree add ~/git/my-linked-repo
4

4 に答える 4

6

ビルドプロセスを変更したくない場合(タイムスタンプではなくハッシュベース)、 gitsourceのcontribディレクトリにあるgit-new-workdirスクリプトを確認することをお勧めします。クローンの提案と同様に、複数の作業コピーを取得しますが、2つの独立したリポジトリの代わりに、複数の作業コピーを含む1つのリポジトリを取得します。したがって、ローカルリポジトリ間でプッシュおよびプルする必要はありません。

これはシェルスクリプトであり、UNIXライクなシステムでのみ実行されますが、この概念は最新バージョンのWindowsで複製できます。

于 2011-05-20T06:36:45.770 に答える
6

ビルド システムが依存関係にあまり熱心ではないと仮定すると (実際には再構築しないのに、再構築する必要があると考えている可能性があります)、これを回避する主な方法は、リポジトリを複製することです。

git clone my-repo my-repo2

その後、追加のクローンで作業し、そこからメインのクローンにプッシュして戻すことができます。(チェックアウトされていないブランチにのみプッシュする必要がありますが、それがここでの要点です。必要に応じて、プルまたはフェッチしてリセットまたはブランチ -f することもできます。)

また、これも実際には多くのスペースを占有しません。Git はリポジトリ内のオブジェクトをローカル クローン用にハードリンクするため、余分なスペースは余分なチェックアウト コピーになります。

于 2011-05-19T13:41:45.930 に答える
4

outputDirectoryNameをオーバーライドすることにより、ブランチごとに異なるターゲットディレクトリを使用してみることができます。たぶん、gitブランチ名を取得し、出力ディレクトリをtarget-<branch>に設定します。それはすべての新しいブランチが最初から始まることを意味しますが。

于 2011-05-19T14:10:59.183 に答える
2

[sbt][1] または「高速な scala コンパイラ」を使用すると、scala のコンパイル時間を大幅に改善できます。どちらもコンパイラをメモリ内に保持できるため、コンパイル時間が大幅に短縮されます。

ブランチごとに 1 つのディレクトリを使用すると、非常に多くの再コンパイルを回避できます。しかし、そのワークフローは Mercurial の方が適切にサポートされています。

于 2011-05-19T13:40:38.120 に答える