はじめに
アプリ開発において「Git」は必須スキルになっています。Gitには様々なコマンドが存在し、それらを適切に使用することで、開発作業の安全性を高め、効率化を実現できます。
あるプロジェクトに携わっていた際に、配布用のコードをまとめることになったとしましょう。.gitignore
で指定されたファイルを除外し、必要なファイルのみを手作業で仕分けましたが、この作業は非常に手間と時間がかかり苦労しました。この経験をきっかけに、もっと効率的な方法はないかと探したところ、git archive
がこのような場面で役立つと知りました。git archive
を使用すると、特定のファイルのみを簡単に収集できたりと、とても便利なのです。
この記事では、アーカイブファイルの作成を容易にする「git archive」について詳しく解説します。様々なGitコマンドを習得して、Gitマスターを目指しましょう!
アーカイブファイルと圧縮ファイルについて
git archive
の詳細な解説に入る前に、基本的な知識を確認しておきましょう。まずはアーカイブファイルと圧縮ファイルについてです。
-
アーカイブファイル
複数のファイルやディレクトリとそのデータの情報(メタデータ)をまとめたファイルです。データを一つのファイルとして長期保存したり、専用の保存領域に保管されます。
-
圧縮ファイル
複数のファイルを1つのアーカイブファイルにまとめ、そのファイル容量を小さく(圧縮)したものです。ファイルの容量を小さくすることで、保存領域の必要な容量を削減したり、データ通信での伝送を短時間でできるようにします。
アーカイブファイルを作成すると聞くと、圧縮ファイルをイメージする事が多いですが、厳密にはこの2つは異なります。
ファイル形式のZipとTarとは?
アーカイブファイル、圧縮ファイルを知った次は、ZipとTarについて学びましょう。これらはどちらもアーカイブ形式のファイルですが、いくつかの違いがあります。
-
Zip
複数ファイルを1つのアーカイブファイルにまとめ、同時に圧縮も行います。収集されたファイルが個別に圧縮されるため、単一のファイルとして扱うことができます。また、圧縮したファイルは復元(解凍)することが可能です。
-
Tar
複数のファイルを1つのアーカイブファイルにまとめますが、圧縮は行いません。Tarファイルには圧縮機能がないため、ファイルの圧縮は、「gzip」や「bzip2」などの圧縮ツールと組み合わせて行われます。アーカイブファイルを作成した後に圧縮ツールを使用することで、目的に応じた圧縮形式に対応できます。
「git archive」について
アーカイブファイルや圧縮ファイルの基本を学んだところで、本題のgit archive
について学んでいきましょう。
git archive
は、Gitリポジトリの特定のリファレンスから、アーカイブファイルを生成するコマンドです。リファレンスとは、コミット、ブランチ、タグ、ツリーなどが含まれます。これらのリファレンスを指定することで、そのリファレンスが指すファイルやディレクトリをアーカイブファイルとしてエクスポートすることができます。
Gitで管理しているプロジェクトを、MacやWindowsに標準搭載されているソフトを使用してアーカイブファイルを作成すると、.git
ファイルや.gitignore
などで無視しているファイルも含まれてしまいます。一方でgit archive
でアーカイブファイルを作成すると、.gitignore
などで無視されているファイルは除外され、アーカイブされません。これは、ソースコードの特定の状態をパッケージ化して配布する場合や、バックアップを作成する際に便利です。
「git archive」コマンドの開発現場での活用例
git archive
コマンドは、開発者がプロジェクトの特定のバージョンを簡単に保存したり共有したりするための便利なツールです。このコマンドを使うことで、特定のブランチやコミットの内容を簡単に他の人と共有したり、バックアップとして保存したりすることができます。これにより、コードの共有やリリース管理、バックアップが容易になり、チームの作業効率が向上します。git archive
コマンドが実際に開発現場でどのように使われているかを具体的に紹介します。
コードの共有
チームメンバーや他のプロジェクトと、特定のコード状態を共有する際に、リポジトリ全体をクローンする代わりにアーカイブファイルを提供することができます。これにより、不要なGit履歴やその他のメタデータを含めずに、必要なファイルだけを共有できます。
バックアップ
リポジトリ全体ではなく、特定のコミットやブランチの状態をバックアップする際に使用します。アーカイブファイルとして保存することで、必要に応じてその状態を簡単に再現することができます。
ドキュメントやサンプルコードの配布
ドキュメントやサンプルコードの配布に、特定のディレクトリやファイルセットだけをエクスポートすることができます。例えば、リポジトリの一部のアーカイブファイルを作成し、ユーザーマニュアルやサンプルコードとして提供することができます。
デプロイメント
ソフトウェアのリリースやデプロイメントのために、特定のブランチやタグのスナップショットを取得する際に利用します。これにより、リリースパッケージを作成しやすくなります。
「git archive」の使い方
ある開発に携わっていた際に、ある時点で最新のリソースファイルのみを納品するという依頼がありました。このような場面では、git archive
コマンドが非常に便利です。このコマンドを使用することで、必要なデータをアーカイブファイルとして効率的に作成することが可能になります。
これから、git archive
を使用した様々な事例を紹介しますが、事例ごとに異なるオプションの使用があります。これらのオプションについては、別のセクション「git archiveのオプション紹介」で詳しく解説します。
特定のバージョンの保存
特定のブランチ、タグ、またはコミットのスナップショットをアーカイブファイルとして保存できます。
以下のコマンドは、現在の最新のコミット(HEAD
)をzip形式でlatest.zip
というファイルに保存します。-o
は指定したファイル名でアーカイブファイルを作成するオプションです。
git archive -o latest.zip HEAD
特定のフォーマットでの保存
git archive
は、tarやzipなどの様々なフォーマットをサポートしています。フォーマットは--format
オプションを使用して指定します。
これは、現在の最新のコミットをtar形式で保存し、それをgzipで圧縮してlatest.tar.gz
というファイルに保存します。
git archive --format=tar HEAD | gzip > latest.tar.gz
サブディレクトリのアーカイブ
リポジトリの一部(特定のサブディレクトリ)だけをアーカイブすることも可能です。
これは、src/
ディレクトリ内のファイルをproject/
というプレフィックス(ファイル名の先頭に追加されるパス)をつけてzipファイルに保存します。
git archive --format=tar --prefix=project/ -o project.tar HEAD src/
「git archive」のオプション紹介
「git archiveの使い方」セクションで少し触れたオプションについて解説していきます。アーカイブファイルを作成する際にオプションを使用することで、目的に合った形にアーカイブすることが可能です。
項目 | 説明 |
---|---|
--output, -o | ファイル名と出力先を指定してアーカイブファイルを作成 |
--format=<fmt> | フォーマットを指定してアーカイブファイルを作成 |
--prefix=<prefix>/ | プレフィックスを追加してアーカイブファイルを作成 |
--output, -o
出力ファイルの名前と場所を指定してアーカイブファイルを作成します。このオプションを使用することで、生成されるアーカイブファイルのファイル名と保存先をコマンド実行時に直接指定できます。
git archive -o [ファイル名] [その他のオプション] [リファレンス]
コマンド例の詳細
- ファイル名: アーカイブファイルのファイル名を含むパスと、ファイルの拡張子も含める必要があり、拡張子によってアーカイブの形式が決定されます(例:
.zip
や.tar
など) - その他のオプション:
-format
,-prefix
などの追加オプションを指定 - リファレンス: アーカイブに含めるコミット、ブランチ、またはタグを指定
以下の実行例は、現在のヘッド(HEAD)の src/
ディレクトリを project.zip
という名前のZIPファイルをデスクトップにアーカイブします。-o
オプションでアーカイブの出力先とファイル名を指定しています。
Macで実行する例
git archive -o /Users/<ユーザー名>/Desktop/project.zip HEAD src/
Windowsで実行する例
git archive -o C:/Users/<ユーザー名>/Desktop/project.zip HEAD src/
--format=<fmt>
フォーマットを指定してアーカイブファイルを作成します。このオプションを使用することで、アーカイブの生成時に使用するファイル形式を明示的に設定することができます。
git archive --format=[形式] -o [出力ファイル名] [リファレンス]
コマンド例の詳細
- 形式: アーカイブファイルの形式(tar、zip など)
- 出力ファイル名: アーカイブファイルの名前と場所を指定
- リファレンス: アーカイブに含めるコミット、ブランチ、またはタグを指定
以下の実行例は、現在のヘッド(HEAD)から全てのファイルを「tar」または「zip」形式でアーカイブし、latest.拡張子
というファイル名で出力します。
tar形式でアーカイブを作成する例
git archive --format=tar -o latest.tar HEAD
zip形式でアーカイブを作成する例
git archive --format=zip -o latest.zip HEAD
--prefix=<prefix>/
プレフィックスを追加してアーカイブファイルを作成します。このオプションを使用すると、アーカイブファイル内のすべてのファイルとディレクトリに共通の先頭パス(プレフィックス)を追加できます。アーカイブを解凍した際には、すべてのファイルが指定したサブディレクトリ内に整理されて配置されるため、ファイル管理が容易になります。
git archive --prefix=[プレフィックス名]/ -o [出力ファイル名] [リファレンス]
コマンド例の詳細
- プレフィックス名: アーカイブ内でのディレクトリ名。スラッシュ**
/
**を付ける必要があります。 - 出力ファイル名: アーカイブファイルの保存名および保存場所を指定
- リファレンス: アーカイブに含めるコミット、ブランチ、またはタグを指定
以下の実行例は、現在のヘッド(HEAD)の src/
ディレクトリをzip形式でアーカイブし、ファイルのパスの前に project/
を追加します。
git archive --prefix=project/ -o latest.zip HEAD src/
この操作により生成されたlatest.zip
ファイルを解凍すると、project
ディレクトリの中にsrc
ディレクトリが含まれています。--prefix
オプションで指定したディレクトリ名の中に、指定したリファレンスのファイル群が整理されて格納されます。
コミットの差分のアーカイブファイル作成
最後にコミットの差分のみのファイルを、アーカイブファイルに作成する方法を紹介します。これは、開発の途中で特定の時点と現在の最新コミットの差分だけを納品する、といった場面で活用できます。差分を抽出するには、git diff
コマンドを組み合わせて行います。
git diffコマンドについては以下の記事で詳しく解説しています。
https://envader.plus/article/245
1:差分ファイルのリストを取得
まず最初にgit diffコマンドを使用して、2つのコミット間の変更点をリストアップします。差分を取得するには以下のコマンドを使用します。
git diff --name-only [比較コミットハッシュ値1] [比較コミットハッシュ値2]
差分ファイルのリストを取得する理由は、特定のコミット間の変更のみを抽出し、そのファイルだけをアーカイブするためです。これにより生成されるアーカイブファイルの容量を小さくすることができて、リソースを節約したり、変更点の明確化に繋がります。
以下は差分ファイルをリストアップした実行例です。最新のコミットとその1つ前のコミット間の変更されたファイルがリストアップされています。
git diff --name-only HEAD~1 HEAD
project/index.html
project/src/App.jsx
project/src/Test.jsx
project/src/components/Test-2.jsx
project/src/components/Test-3.jsx
project/src/components/Test.jsx
project/src/main.jsx
2:差分ファイルのアーカイブを作成
差分ファイルが分かったところで、git archive
コマンドでアーカイブを作成します。ここでは、xargs
を使用してファイル名をgit archive
に渡す方法を紹介します。
git diff --name-only [比較コミットハッシュ値1] [比較コミットハッシュ値2] | xargs git archive -o update.zip HEAD
xargs
は、Unix系オペレーティングシステムで使用されるコマンドラインユーティリティです。このコマンドは、標準入力からデータを受け取り、それを引数として他のコマンドに渡すことができます。xargs
を使用すると、空白や特殊文字を含むファイル名を正しく処理することができるため、エラーが発生するリスクを低減します。
以下のコマンドでは、最新のコミットとその1つ前のコミット間の変更されたファイルをリストアップし、その変更ファイルのリストを引数としてgit archive
へ渡し、アーカイブファイルを作成します。
git diff --name-only HEAD~1 HEAD | xargs git archive -o update.zip HEAD
以下は実行結果です。最初に確認した差分ファイルのみがアーカイブされました。これによりデータ容量を節約し、変更されたファイルが明確になります。
この記事で学んだこと
この記事を通じて、「git archive」に関連する様々な知識を得ることができました。簡単に振り返ってみましょう。
「git archive」とは
git archive
は、Gitリポジトリの特定のリファレンスから、アーカイブファイルを生成するコマンドです。リファレンスとは、コミット、ブランチ、タグ、ツリーなどが含まれます。これらのリファレンスを指定することで、そのリファレンスが指すファイルやディレクトリをアーカイブファイルとしてエクスポートすることができます。
さまざまな形でのアーカイブ
git archive
を使用すると、プロジェクトの必要なデータを目的に応じた形式でアーカイブファイルにまとめることが可能です。これにより、特定のブランチ、タグ、またはコミットのスナップショットを柔軟に指定し、希望するアーカイブ形式で出力することができます。
この記事では「git archive」の基本や実際の利用法に至るまで、その活用法を詳しく解説してきました。
ぜひこのコマンドを日々の学習に取り込み、実践を通じて理解を深めていきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.11.26
gitのコミット履歴を整理するためにsquashを使いこなそう
Squashは、複数のコミットを1つのコミットにまとめる操作です。Squashを使用すると、コミットの履歴を整理したり、コミットのメッセージや変更内容を変更したりすることができます。
- インフラエンジニア
- git
2024.05.27
ソースコードにパッチファイルを適用するGitコマンド「git apply」について徹底解説!
この記事では「git apply」コマンドについて解説します。
- git
2024.05.29
Gitで間違ってコミットしたファイルを後から無視する方法 .gitignoreの設定
ここでは、架空のプロジェクト「AwesomeProject」での失敗談を元に、誤って追跡されたファイルを後から管理外にする方法を解説します。
- git