ディレクトリが Git で追跡されているかどうかを確認する方法

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、ディレクトリが Git で追跡されているかどうかを判断する方法を学びます。特定のコミットにおけるファイルとディレクトリを調べるために、git ls-tree コマンドを使用して Git リポジトリの内容を調査します。

さらに、git status コマンドを利用して、リポジトリ内のファイルの現在の追跡状態を確認し、Git が空のディレクトリをどのように扱うかを理解します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/SetupandConfigGroup -.-> git/git("Show Version") git/BasicOperationsGroup -.-> git/status("Check Status") subgraph Lab Skills git/git -.-> lab-560020{{"ディレクトリが Git で追跡されているかどうかを確認する方法"}} git/status -.-> lab-560020{{"ディレクトリが Git で追跡されているかどうかを確認する方法"}} end

ディレクトリに対して git ls-tree を実行する

このステップでは、git ls-tree コマンドを使用して Git リポジトリの内容を調査します。このコマンドを使うと、特定のコミットにおけるディレクトリの状態を表すツリーオブジェクトの内容を表示できます。

まず、my-time-machine ディレクトリにいることを確認してください。

cd ~/project/my-time-machine

では、git ls-tree を使って最新のコミットの内容を見てみましょう。最新のコミットを参照するために HEAD を使用します。

git ls-tree HEAD

以下のような出力が表示されるはずです。

100644 blob a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9	message.txt

この出力を分解してみましょう。

  • 100644: これはファイルモードで、通常のファイルであることを示しています。
  • blob: これはオブジェクトのタイプを示しています。blob オブジェクトはファイルの内容を格納します。
  • a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9: これは message.txt の内容を格納する blob オブジェクトの一意の識別子(SHA-1 ハッシュ)です。あなたのハッシュは異なるものになります。
  • message.txt: これはファイル名です。

git ls-tree コマンドは、特定のコミットの内容を調べるのに便利で、コミット全体をチェックアウトする必要はありません。このコマンドを使うと、その時点で Git が追跡していたファイルとディレクトリを確認できます。

これは、特定のタイムカプセル(コミット)の中を見て、どのファイルが含まれていたか、それらの一意の指紋(blob ハッシュ)は何かを正確に確認するようなものです。これは、プロジェクトの履歴の構造と内容を理解する強力な方法です。

git status を使って追跡状態を確認する

前のステップでは、ファイルを作成し、それを Git リポジトリにコミットしました。では、再度 git status コマンドを使用して、リポジトリの現在の状態を確認し、ファイルが追跡されていることを確認しましょう。

まだ ~/project/my-time-machine ディレクトリにいることを確認してください。

cd ~/project/my-time-machine

次に、git status コマンドを実行します。

git status

以下のような出力が表示されるはずです。

On branch master
nothing to commit, working tree clean

この出力からいくつかの重要な情報がわかります。

  • On branch master: 現在、master ブランチにいます。これはプロジェクトのメインのタイムラインです。
  • nothing to commit, working tree clean: これが重要な部分です。作業ディレクトリに未コミットの変更がないことを意味します。Git は追跡対象のすべてのファイルを追跡しており、追加またはコミットする必要のある新しいまたは変更されたファイルはありません。

これは、変更を完了してコミットしたときの理想的な状態です。これにより、Git がプロジェクトの現在の状態を認識しており、リポジトリ内のすべてが最新であることが確認されます。

この出力を、message.txt を作成してコミットする前に見た git status の出力と比較すると、空のリポジトリ、追跡されていないファイルがあるリポジトリ、および追跡されたファイルがあるクリーンなリポジトリの違いが明確になります。

git status を理解することは非常に重要です。これは、リポジトリ内で何が起こっているか、および必要なアクション(ファイルの追加やコミットなど)を把握するための主要なツールだからです。

空のディレクトリをテストする

このステップでは、Git が空のディレクトリをどのように扱うかを調べます。これは初心者にとってよく混乱するポイントです。なぜなら、Git はディレクトリをファイルとは異なる方法で扱うからです。

まず、~/project/my-time-machine ディレクトリにいることを確認してください。

cd ~/project/my-time-machine

では、プロジェクト内に新しい空のディレクトリを作成しましょう。

mkdir empty-folder

ディレクトリを作成しました。次に、git status を使用してリポジトリの状態を確認します。

git status

以下のような出力が表示されるはずです。

On branch master
nothing to commit, working tree clean

Git は empty-folder を追跡されていないディレクトリとして報告していないことに注意してください。これは、Git がディレクトリ自体ではなくファイルの内容を追跡するためです。空のディレクトリには追跡する内容がありません。

これは Git における重要な概念です。リポジトリに空のディレクトリを含める必要がある場合、一般的な解決策は、その中にダミーファイルを配置することです。一般的な方法は、.gitkeep という名前のファイルを作成することです(名前は重要ではなく、ただの慣習です)。

empty-folder 内に .gitkeep ファイルを作成しましょう。

touch empty-folder/.gitkeep

では、再度 git status を確認しましょう。

git status

今度は、以下のように表示されるはずです。

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	untracked files present (use "git add" to track)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	empty-folder/

これで、Git は empty-folder/ を認識します。なぜなら、その中に追跡可能なファイル(.gitkeep)が含まれているからです。

これは、Git がディレクトリ自体ではなく、ディレクトリ内のファイルの存在を追跡することを示しています。ディレクトリをリポジトリの履歴に含めるには、少なくとも 1 つの追跡されたファイルが含まれている必要があります。

まとめ

この実験では、ディレクトリとその内容が Git によって追跡されているかどうかを確認する方法を学びました。git ls-tree HEAD コマンドを使用して最新のコミットの内容を調べ、このコマンドが追跡されているファイルとそれに関連するブロブオブジェクトおよびハッシュを表示することを理解しました。このコマンドは、特定のコミット時点でのリポジトリの状態のスナップショットを提供します。

また、git status コマンドを利用して、リポジトリ内のファイルの現在の追跡状態を確認し、コミットされたファイルが実際に Git によって追跡されていることを確認しました。最後に、Git が空のディレクトリをどのように扱うかを調べ、Git は空のディレクトリを直接追跡せず、その中のファイルを追跡することを発見しました。