Git LFSとサブモジュールの初期化
LFSとサブモジュールの初期化
フォルダ内でGitリポジトリを初期化し、サブフォルダのGitリポジトリと大きなファイル(Git Large File Storage, LFSを使用)を含めるには、LFSとサブモジュールを初期化する必要があります:
-
Git LFSのインストール: Git LFS公式サイトを訪れてインストール方法を確認してください。
-
トップレベルフォルダをGitリポジトリとして初期化: コマンドラインまたはターミナルを開き、トップレベルフォルダのパスに移動し、以下のコマンドを実行して新しいGitリポジトリを初期化します:
1
git init
-
Git LFSサポートの追加: 同じディレクトリで、以下のコマンドを実行してGit LFSを有効にします:
1
git lfs install
-
LFSで大きなファイルを追跡する設定: LFSで追跡する大きなファイルまたはファイルタイプを決定します。
git lfs track
コマンドを使用して指定します。たとえば、すべての.zip
ファイルを追跡したい場合、以下を実行します:1
git lfs track "*.zip"
このコマンドを実行すると、
.gitattributes
ファイルに関連する設定が追加されます。.gitattributes
ファイルをリポジトリに追加することを忘れないでください:1
git add .gitattributes
-
サブフォルダのGitリポジトリをサブモジュールとして追加: サブフォルダが既にGitリポジトリであり、その独立した更新とコミット履歴を保持したい場合、それをサブモジュールとして追加できます。以下のコマンドを使用します。
path_to_subfolder
はサブフォルダの相対パスです:1
git submodule add <repository_url> path_to_subfolder
注意:
<repository_url>
をサブフォルダのGitリポジトリのリモートリポジトリURLに置き換えてください。サブフォルダのGitリポジトリにリモートリポジトリがない場合、最初にサブフォルダ用のリモートリポジトリを作成する必要があります。 -
コミットとプッシュ: LFS追跡を設定し、必要なファイルをすべて追加したら、これらの変更をGitリポジトリに追加し、コミットできます:
1 2
git add . git commit -m "Initial commit with LFS and submodule"
トップレベルリポジトリに対応するリモートリポジトリがある場合、
git push
コマンドを使用して変更をリモートリポジトリにプッシュします。
以上の手順に従うことで、他の大きなファイルやサブフォルダのGitリポジトリを含むトップレベルフォルダ内で、Gitリポジトリを初期化し、Git LFSを有効にすることができます。
LFSの分離
GitとGit Large File Storage (LFS)を使用する場合、通常LFSの設定はリポジトリ全体に対して行われ、個別のリモートリポジトリに対して行われるわけではありません。これは、LFSが有効になり、特定のファイルタイプが追跡されると、これらのLFS追跡ファイルがどのリモートリポジトリにプッシュされる際にも一緒に処理されることを意味します。
しかし、特定のリモートリポジトリにLFS追跡ファイルをプッシュしたくない場合、LFSオブジェクトと非LFSオブジェクトを管理するために2つの独立したブランチを使用し、LFSオブジェクトを含まないブランチのみを特定のリモートリポジトリにプッシュする必要があります。
1. 2つのブランチを維持する
- LFSブランチ:このブランチにはLFSで追跡されたファイルが含まれ、通常通りこのブランチで作業できます。
- 非LFSブランチ:このブランチにはLFSで追跡されたファイルが含まれていません。.gitattributesのフィルタリングルールを使用するか、大きなファイルをこのブランチにコミットしないようにしてこの状態を維持します。
2. ブランチ戦略
リモートリポジトリに変更をプッシュする準備ができたら、LFSオブジェクトを含める必要があるかどうかを確認します。
- 必要がある場合は、通常通り変更を対応するリモートリポジトリのブランチにプッシュします。
- 必要がない場合は、LFSファイルを含まない変更を非LFSブランチにマージし、このブランチのみを特定のリモートリポジトリにプッシュします。
3. 操作の例
main
が主要な作業ブランチ(LFSブランチ)で、non-lfs-branch
が非LFSブランチであると仮定します。LFSファイルを含めたくないリモートリポジトリにプッシュする場合、次のように操作します:
-
non-lfs-branch
が最新であり、main
ブランチのすべての非LFS変更を含んでいることを確認します。1 2
git checkout non-lfs-branch git merge main --no-commit --no-ff
マージ中にLFSファイルを含む変更が発生した場合、これらの差異を手動で解決し、LFSファイルを含めないようにします。
-
マージが完了したら、
non-lfs-branch
をLFSファイルを必要としないリモートリポジトリにプッシュします。1
git push <remote-name> non-lfs-branch:<remote-branch-name>
<remote-name>
と<remote-branch-name>
をターゲットのリモートリポジトリ名とブランチ名に置き換えてください。