Gitで作業を最適化するいくつかの方法

Habréのブログでは、IaaSの世界からだけでなく、さまざまなテクノロジーについて説明しています。 たとえば、最近、VPNソフトウェアの実装に関する資料を公開しました[ 第1部 ; パート2 ]、およびDNSについても説明しまし 。 今日は、アプリケーションとサービスの開発のトピックを掘り下げ、Gitのようなもの、特にGitでの作業を最適化する方法についてお話したいと思います。





/写真hackNY.org CC





私は最初から始めたいと思います-Gitとは何ですか? Gitはバージョン管理システム(VCS)の1つであり、それに基づいてGitHubやGitLabなどのいくつかのサービスが構築されます。 Gitを使用して、Linuxカーネル、Firefox、Chromeなど、おそらく使い慣れた大量のソフトウェアが開発されました。



ソフトウェア製品のチームとして働いた場合、すべてがどのように起こるか想像できます。 同僚に送信するプロジェクトの特定のバージョンがあります。 彼らはコードを変更し、それらを送り返します。 それらをコードベースに埋め込み、プロジェクトの新しいバージョンを取得します。



Gitの主なタスクの1つは、project_betterVersion.kdenliveやproject_FINAL-alternateVersion.kdenliveなどの名前のファイルが表示されたときに、製品バージョン間の混乱を避けることです。



これらのファイルでの作業を簡素化するには、VCSシステムも必要です。 そのため、チームの各メンバーは、プロジェクトの最新バージョンに取り組み、変更を加えて同僚に報告する機会があります。



制御システムを使用すると、同じドキュメントのさまざまなバリエーションを保存し、必要に応じて以前の実装に「ロールバック」できます。 つまり、リポジトリのコピーを作成してローカルで操作し、特別なコマンドを使用して編集をメインバージョンに埋め込む(プッシュ)か、同僚が行った変更を抽出(プル)することができます。



生産性を向上



大規模な製品で作業する場合、ソースコードは常に名前が変更され、新しいブランチが選択され、以前のバージョンと比較されます。 したがって、十分に大きなプロジェクトでは、Gitのパフォーマンスが低下する可能性があります。 このような問題は、Facebookでも発生していました。



次に、ソースファイルを変更するとインデックスファイルが上書きされ、大規模プロジェクトではサイズが100 MBを超えるという事実によって、作業難しさを説明しました。 これにより速度が低下しました(ところで、会社のエンジニアが提案したFacebookバージョン管理システムのパフォーマンスに関する別の問題に対する興味深いソリューションがあります)。



Gitとの作業を高速化するために、開発者はさまざまな手法、ユーティリティ、およびソリューションを使用しています。 1つのオプションは、リポジトリのサイズを小さくすることです。



リポジトリの削減



RoR開発者のSteve Lorekがブログで、リポジトリのサイズを180 MBから7 MBに減らすことができたと書いています。 これを行うために、彼は最初にGitのローカルコピーを作成し、次にストレージ領域を大量に占有するファイルを見つけました。 ここで、Anthony Stubbsのbashスクリプトが助けになり、10個の最も大きくて最も不必要なファイルを見つけました。



その後、一連のコマンドを使用してこれらのファイルを削除しました。



$ git filter-branch --tag-name-filter cat --index-filter 'git rm -r --cached --ignore-unmatch filename' --prune-empty -f -- --all $ rm -rf .git/refs/original $ git reflog expire --expire=now –all $ git gc --prune=now $ git gc --aggressive --prune=now
      
      





その後、Steveは変更をリモートリポジトリに送信して、作業のために180メガバイトをダウンロードする必要のある人がいないようにしました。



スマートミラーリング



これは、数百人の開発者がいる組織に役立つ別のソリューションです。 このようなチームの多くのメンバーは、遠隔地やさまざまな国で働いているため、リポジトリからのデータの読み込みが遅れます。 従業員がハードドライブを郵送することもあります。



ミラーリング時には、1つ以上のアクティブなミラーサーバーが構成されます。これらのサーバーは、リポジトリのコピーの読み取りのみを実行し、メインインスタンスと同期します。 このアプローチにより、リポジトリコピーの転送時間が5 GB短縮され、約25倍になります。



大きなファイルを保存する別のアプローチ



各開発者が自分のコンピューターに変更の履歴全体を保存するという事実により、Gitリポジトリーのサイズは急速に拡大しています。 ただし、これらの問題を解決するユーティリティは多数あります 。 たとえば、 git-annexを使用すると、ファイル全体ではなくシンボリックリンクを保存できます。



また、注目に値するのはGit Large File Storage( Git LFS )拡張機能です。これは、ファイルポインターをリポジトリに書き込みます。 これらのファイルの操作は、クリーンフィルターとスマッジフィルターを使用して監視され、そのコンテンツはリモートのGitHub.comまたはGitHub Enterpriseサーバーに保存されます。 他のいくつかのユーティリティの説明については、 こちらをご覧ください



エイリアスを使用する



このヒントは、Gitのパフォーマンスとファイルのアップロード速度についてではなく、使いやすさについてです。 エイリアスを定義すると、Gitでの作業速度が大幅に向上し、多くの操作が簡素化されます。 エイリアスは、構成ファイルを使用して構成されます。



 git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.st status
      
      





興味深いことに、この方法では、デフォルトではシステムにない独自のコマンドを作成できます。次に例を示します。



 git config --global alias.l "log --oneline --graph"
      
      





具体的には、この場合、git lコマンドを使用して、ログを1行でグラフィカルに表示できます。



これらの小さなヒントは、大規模リポジトリでの作業を簡素化し、開発チームの作業を楽にします。 そして、これは会社の重要なプロジェクトの品質と実施の速さの点で大したことです。



PSそして、私たちはIaaSプロバイダー1cloudの作成についても書いています:






All Articles